CURRENT LOGIC
首先,我想我已经阅读了所有关于回形针的文章,尽管学到了所有的信息,但我还是被困了......所以我可以说你的帮助真的很珍贵。
其次,我不使用delayed_paperclip,也不使用s3_direct_upload(但是jquery directUpload)。
我有4个不同图片的用户个人资料:logo,avatar,worka,workb
- 每种格式(徽标,头像,工作,工作)都有3种风格(:小,拇指,中等)
- 用户可以更新其图片=> 因此需要更新操作
- 4个文件字段的格式为其他经典字段(名称,电子邮件,...)
- 上传由jQuery DirectUpload + Paperclip
管理
当用户单击文件字段以添加图像时:
- jQuery DirectUpload将文件上传到s3
上的临时目录- 使用url(key)
的jQuery回调- 将网址指定为:temp为javascript生成的隐藏字段
按下表单提交按钮时:
- 我在回形针上分配了直接上传文件的网址,并在
@user.logo.temp
的帮助下包含了网址(密钥)- Paperclip生成所有样式
<input type="hidden" name="user[logo_attributes][temp]" value="https://bucketname.s3.amazonaws.com/temp/e4b46d01-5d69-483b.jpg">
我的问题: STYLES GENERATION让我想起HEROKU IDLE和TIMEOUT#15#12
ATTEMPTS:我试图隔离上传过程以将其置于后台工作
我无法弄清楚如何在第一次上传时阻止回形针样式生成并在后台作业后生成它们
- before_post_process 阻止所有后期处理,即使在后台工作中也是如此
我没有使用.reprocess!自回形针4开始,更新被触发并且......无限循环... ,所以我使用 .assign 和 .save 代替
- 从S3托管文件正确分配文件,然后由paperclip处理
- 我不确定文件字段中的文件,如果是否上传(在控制台中没有上传文件,但由于表单已被提交,文件也是如此,即使未使用。
需要:在后台工作中处理的样式已被阻止
我的徽标模型
class Logo < Document
S3_TEMP_URL_FORMAT = %r{\/\/bucketname\.s3\.amazonaws\.com\/(?<path>temp\/.+\/(?<filename>.+))\z}.freeze
has_attached_file :attachment,
styles: { medium: "300x300#" },
convert_options: { medium: "-quality 75 -strip" },
default_url: ":parent_type/:class/:style/missing.png",
path: "/documents/:parent_type/:id_partition/:class/:style/:basename.:extension"
validates_attachment :attachment,
content_type: { content_type: ["image/gif", "image/png", "image/jpg", "image/jpeg"] },
size: { less_than: 1.megabyte }
validates :temp,
# presence: true,
format: { with: S3_TEMP_URL_FORMAT }
before_save :set_attachment
after_save :set_remote_url
before_post_process :stop_process
def stop_process
false
end
def styles_process
self.attachment.assign(attachment)
self.save
end
def set_attachment
# puts "BEGIN -- SET ATTACHMENT"
tries ||= 5
s3_temp_url_data = S3_TEMP_URL_FORMAT.match(self.temp)
s3 = AWS::S3.new
s3_temp_head = s3.buckets[ENV['S3_BUCKET']].objects[s3_temp_url_data[:path]].head
self.attachment_file_name = s3_temp_url_data[:filename]
self.attachment_file_size = s3_temp_head.content_length
self.attachment_content_type = s3_temp_head.content_type
self.attachment_updated_at = s3_temp_head.last_modified
rescue AWS::S3::Errors::NoSuchKey => e
tries -= 1
if tries > 0
sleep(3)
retry
else
false
end
end
def set_remote_url
s3_temp_url_data = S3_TEMP_URL_FORMAT.match(self.temp)
s3 = AWS::S3.new
self.attachment = URI.parse(self.temp)
self.save
s3.buckets[ENV['S3_BUCKET']].objects.with_prefix(s3_temp_url_data[:path]).delete_all
end
end
我的控制器
def update
account_update_params = devise_parameter_sanitizer.sanitize(:account_update)
@user = User.find(current_user.id)
if @user.update_attributes(account_update_params)
# Here is the styles processing
# This is where the Resque background job would go
@user.logo.styles_process
set_flash_message :notice, :updated
redirect_to after_update_path_for(@user)
else
render :edit
end
end
我的表格
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), method: :put, html: { class: "form-horizontal directUpload", role: "form" }) do |f| %>
<%= f.fields_for :logo do |l| %>
<%= l.file_field(:attachment, accept: 'image/gif,image/png,image/jpg,image/jpeg') %>
<% end %>
<input type="hidden" name="user[logo_attributes][temp]" value="https://bucketname.s3.amazonaws.com/temp/e4b46d01-5d69-483b.jpg">
<% end %>