我使用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会重新复制文件?
答案 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