0

私は Paperclip 4.0.2 を使用し、アプリで写真をアップロードしています。

したがって、私の Document モデルには attachment_file という名前がありますattachment

添付ファイルにはスタイルがほとんどありません。:medium, :thumb, :facebook

私のモデルでは、スタイルの処理を停止し、バックグラウンド ジョブ内で抽出しました。

class Document < ActiveRecord::Base
# stop paperclip styles generation    
before_post_process
  false
end

しかし、:original スタイル ファイルはまだアップロードされています。

この動作を停止し、リモート ディレクトリから :original/filename.jpg 内のファイルをコピーできるかどうかを知りたいです。私の目標は、S3 の /temp/ ディレクトリにアップロードされたファイルを jQuery ファイル アップロードで使用することです。 、それを Paperclip が他のスタイルを生成するために必要とするディレクトリにコピーします。

よろしくお願いします。

4

1 に答える 1

0

新しい答え:

ペーパークリップの添付ファイルはflush_writes、あなたの目的のために、Paperclip::Storage::S3モジュールの一部であるメソッドでアップロードされます。アップロードを担当する行は次のとおりです。

s3_object(style).write(file, write_options)

したがって、monkey_patch を使用して、これを次のように変更できます。

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::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

現在、オリジナルはアップロードされません。元のファイルが s3 に直接アップロードされた場合に、元のファイルを適切な最終的な場所に転送したい場合は、以下の元の回答のような行をモデルに追加できます。

元の回答:

おそらく、after_create コールバックで実行されるモデルに次のようなものを配置します。

    paperclip_file_path = "relative/final/destination/file.jpg"
    s3.buckets[BUCKET_NAME].objects[paperclip_file_path].copy_from(relative/temp/location/file.jpg)

https://github.com/uberllamaに感謝

于 2014-08-30T17:46:01.860 に答える