use*_*320 5 heroku amazon-s3 paperclip delayed-job
我需要有关使用heroku,回形针,延迟作业以及必要时s3上传和延迟处理文件的设计的反馈.部分内容已经在其他地方讨论过,但我无法在任何地方找到完整的讨论.
任务描述:
由于我使用延迟作业,我必须决定将文件存储在数据库中还是存储在s3上.我假设将文件存储在Web服务器上是不可能的,因为我正在使用heroku和延迟工作.将文件上传到s3需要很长时间.但是,在db中存储文件更加昂贵.理想情况下,我们希望处理尽快完成.
什么是更常见的设计模式?在s3上存储文件?将文件存储在db中?用于检索和处理存储在s3中的文件的任何特定推荐宝石(aws-s3?s3?)?
Heroku 对任何服务器请求都有 30 秒的超时(通过艰难的方式学习),因此必须将文件存储在 s3 上。
尝试使用Carrierwave ( Carrierwave Railscasts ) 而不是 Paperclip,因为我更喜欢附带的附加帮助程序,此外还有许多很棒的插件,例如用于将大文件上传到 s3 的Carrierwave_direct ,它与 Carrierwave 很好地集成。
Delayed_job (railscasts -elasted_job ) 可以很好地从 s3 中删除文件以及可能需要的任何其他后台处理。
我的 gem 文件包含以下内容:
gem 'delayed_job'
gem "aws-s3", :require => 'aws/s3'
gem 'fog'
gem 'carrierwave'
gem 'carrierwave_direct'
Run Code Online (Sandbox Code Playgroud)
雾宝石是将所有帐户信息放在一个地方的好方法,并且可以很好地设置所有内容。对于 AWS gem操作方法,很好的资源。
这是提交表单上传时的示例控制器(肯定有更好的方法来执行此操作,但出于说明目的)
def create
@asset = Asset.new(:description => params[:description], :user_id => session[:id], :question_id => @question.id)
if @asset.save && @asset.update_attributes(:file_name => sanitize_filename(params[:uploadfile].original_filename, @asset.id))
AWS::S3::S3Object.store(sanitize_filename(params[:uploadfile].original_filename, @asset.id), params[:uploadfile].read, 'bucket_name', :access => :private, :content_type => params[:uploadfile].content_type)
if object.content_length.to_i < @question.emailatt.to_i.megabytes && object.content_length.to_i < 5.megabytes
url = AWS::S3::S3Object.url_for(sanitize_filename(params[:uploadfile].original_filename, @asset.id), 'bucket_name')
if @asset.update_attributes(:download_link => 1)
if Usermailer.delay({:run_at => 5.minutes.from_now}).attachment_user_mailer_download_notification(@asset, @question)
process_attachment_user_mailer_download(params[:uploadfile], @asset.id, 24.hours.from_now, @question.id)
flash[:notice] = "Thank you for the upload, we will notify this posts author"
end
end
end
else
@asset.destroy
flash[:notice] = "There was an error in processing your upload, please try again"
redirect_to(:controller => "questions", :action => "show", :id => @question.id)
end
end
private
def sanitize_filename(file_name, id)
just_filename = File.basename(file_name)
just_filename.sub(/[^\w\.\-]/,'_')
new_id = id.to_s
new_filename = "#{new_id}" + just_filename
end
def delete_process(uploadfile, asset_id, time, question_id)
asset = Asset.find(:first, :conditions => ["id = ?", asset_id])
if delete_file(uploadfile, asset_id, time) && asset.destroy
redirect_to(:controller => "questions", :action => "show", :id => question_id)
end
end
def process_attachment_user_mailer_download(uploadfile, asset_id, time, question_id)
asset = Asset.find(:first, :conditions => ["id = ?", asset_id])
if delete_file(uploadfile, asset_id, time) && @asset.delay({:run_at => time}).update_attributes(:download_link => 0)
redirect_to(:controller => "questions", :action => "show", :id => question_id)
end
end
#S3 METHODS FOR CREATE ACTION
#deletes the uploaded file from s3
def delete_file(uploadfile, asset_id, time)
AWS::S3::S3Object.delay({:run_at => time}).delete(sanitize_filename(uploadfile.original_filename, asset_id), 'bucket_name')
end
Run Code Online (Sandbox Code Playgroud)
我知道有很多不必要的代码(这是我刚开始使用 Rails 时写的)。希望它能让您对编写此类应用程序所涉及的流程有所了解。希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
4513 次 |
| 最近记录: |