Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 Rails 4和曲别针-停止:原始样式文件上载以从S3远程目录复制它_Ruby On Rails 4_Callback_Paperclip_Post Processing - Fatal编程技术网

Ruby on rails 4 Rails 4和曲别针-停止:原始样式文件上载以从S3远程目录复制它

Ruby on rails 4 Rails 4和曲别针-停止:原始样式文件上载以从S3远程目录复制它,ruby-on-rails-4,callback,paperclip,post-processing,Ruby On Rails 4,Callback,Paperclip,Post Processing,我使用回形针4.0.2和我的应用程序上传图片 因此,我的文档模型附带了一个名为attachment的_文件 附件有几种风格,比如:中等,:拇指,:脸谱 在我的模型中,我停止样式处理,并在后台作业中提取样式 class Document < ActiveRecord::Base # stop paperclip styles generation before_post_process false end 但是:原始样式文件仍然上传 我想知道是否有可能停止此行为并从远程目录复制

我使用回形针4.0.2和我的应用程序上传图片

因此,我的文档模型附带了一个名为attachment的_文件

附件有几种风格,比如:中等,:拇指,:脸谱

在我的模型中,我停止样式处理,并在后台作业中提取样式

class Document < ActiveRecord::Base
# stop paperclip styles generation    
before_post_process
  false
end
但是:原始样式文件仍然上传

我想知道是否有可能停止此行为并从远程目录复制:original/filename.jpg中的文件 我的目标是使用一个上传到S3/temp/目录中的文件和jQuery文件上传,并将其复制到曲别针需要的目录中,以生成其他样式

提前感谢您的帮助

新答案:

回形针附件通过flush_writes方法上传,出于您的目的,该方法是模块的一部分。负责上传的线路为:

s3_object(style).write(file, write_options)
因此,通过monkey_补丁,您可以将其更改为:

s3_object(style).write(file, write_options) unless style.to_s == "original" and @queued_for_write[:your_processed_style].present?
编辑:这将通过创建以下文件来完成:config/initializers/decorators/paperclip.rb


谢谢

谢谢你的回答。我可以问一下你是如何着手解决这个问题的吗?您是否制作了一个像paperclip_holder.rb这样的初始值设定项来保持gem的完整性?您可以通过创建一个使用class_eval方法的初始值设定项来重写该方法。我将在我的答案中添加一个例子。@user3181644-我在我的答案中添加了一个更完整的解释,这非常有帮助,因为这是我第一次使用这种技巧。但是,在装饰器中添加修改后的存储模块,并在before_save(因为表单处于创建+更新操作回调)中复制文件后,我可以在日志中观察到:按下表单提交按钮上载不应该上载的原始文件,然后后台作业按所需方式处理样式。回形针可以读懂装潢师的意思,但似乎并没有阻挡原来的风格unfortunately@user3181644-我的理解是,您的工作流是这样的:1Browser将图像上载到AWS S3 2PaperClip将图像下载到服务器的/tmp目录3Paperclip处理图像生成样式4Paperclip将样式上载到其最终S35 AWS上的位置将原始位置从临时位置转移到最终位置。这准确吗?根据您的日志,原始文件在什么时候以什么方式被错误上传?
Paperclip::Storage::S3.class_eval do
  def flush_writes #:nodoc:
    @queued_for_write.each do |style, file|
    retries = 0
      begin
        log("saving #{path(style)}")
        acl = @s3_permissions[style] || @s3_permissions[:default]
        acl = acl.call(self, style) if acl.respond_to?(:call)
        write_options = {
          :content_type => file.content_type,
          :acl => acl
        }

        # add storage class for this style if defined
        storage_class = s3_storage_class(style)
        write_options.merge!(:storage_class => storage_class) if storage_class

        if @s3_server_side_encryption
          write_options[:server_side_encryption] = @s3_server_side_encryption
        end

        style_specific_options = styles[style]

        if style_specific_options
          merge_s3_headers( style_specific_options[:s3_headers], @s3_headers, @s3_metadata) if style_specific_options[:s3_headers]
          @s3_metadata.merge!(style_specific_options[:s3_metadata]) if style_specific_options[:s3_metadata]
        end

        write_options[:metadata] = @s3_metadata unless @s3_metadata.empty?
        write_options.merge!(@s3_headers)

        s3_object(style).write(file, write_options) unless style.to_s == "original" and @queued_for_write[:your_processed_style].present?
      rescue AWS::S3::Errors::NoSuchBucket
        create_bucket
        retry
      rescue AWS::S3::Errors::SlowDown
        retries += 1
        if retries <= 5
          sleep((2 ** retries) * 0.5)
          retry
        else
          raise
        end
      ensure
        file.rewind
      end
    end
    after_flush_writes # allows attachment to clean up temp files
    @queued_for_write = {}
  end
end
    paperclip_file_path = "relative/final/destination/file.jpg"
    s3.buckets[BUCKET_NAME].objects[paperclip_file_path].copy_from(relative/temp/location/file.jpg)