使用延迟回形针和S3直接上传

时间:2014-11-25 12:56:14

标签: ruby-on-rails ruby-on-rails-4 amazon-s3 paperclip delayed-paperclip

我使用Delayed Paperclip以及直接上传到S3。我的模型名为Photo,其附件为image

使用照片表单中的JavaScript将图像上传到S3。该文件存储在Paperclip期望找到原始图像的位置,文件详细信息将保存到隐藏字段。提交表单后,这些属性将写入Photo模型:

image_file_name image_file_size image_content_type

因为单独编写这些属性似乎不足以触发Delayed Paperclip来处理图像,所以Photo.save之后我调用Photo.image.reprocess!确实得到了DelayedPaperclip以创建一个新的Sidekiq作业成功处理图像。

问题是,当我在Photo.save中调用PhotosController时,文件将从S3复制到temp目录,然后再复制到S3。这发生在工作之外并且阻塞:

[paperclip] copying image_assets/grab-original.tiff to local file /var/folders/bv/x495g9g10m7119680c9ssqmr0000gn/T/94943834d26bcb8b471f4eeb2a7f899d20141125-3895-1oqom7l
[AWS S3 200 2.601589 0 retries] get_object(:bucket_name=>"example-com-development",:key=>"image_assets/grab-original.tiff")

[paperclip] saving image_assets/grab-original.tiff
[AWS S3 200 2.47114 0 retries] put_object(:acl=>:public_read,:bucket_name=>"example-com-development",:cache_control=>"max-age=29030400",:content_length=>534472,:content_type=>"image/tiff",:data=>Paperclip::AttachmentAdapter: grab.tiff,:key=>"image_assets/grab-original.tiff")

为什么Paperclip会重新复制文件?

1 个答案:

答案 0 :(得分:0)

我的方法很糟糕。即使它有效,也不会将image_processing属性添加到Photo模型中。

在深入研究Delayed Paperclip API之后,以下似乎已经成功了:

内部PhotosController#create

# Ensure we are flagged as processing
@media_item.photo.prepare_enqueueing_for(:image)

if @media_item.save
   # Add Job
   @media_item.photo.enqueue_delayed_processing
end

respond_with(:admin, @galleryable, @media_item)

我在这里要求更好的API:https://github.com/jrgifford/delayed_paperclip/issues/116