Heroku có thời gian chờ là 30 giây trên bất kỳ yêu cầu nào của máy chủ (đã học được cách cứng), vì vậy, lưu trữ các tệp trên s3 chắc chắn là điều bắt buộc.
Hãy thử carrierwave (carrierwave railscasts) thay vì kẹp giấy, như tôi thích những người giúp đỡ thêm rằng đi trên tàu, cộng với có một số plugin tuyệt vời, như carrierwave_direct để tải các file lớn để S3, trong đó tích hợp độc đáo với carrierwave.
Delayed_job (railscasts - delayed_job) sẽ hoạt động tốt để xóa tệp khỏi s3 và bất kỳ quá trình xử lý nền nào khác có thể được yêu cầu.
tập đá quý của tôi bao gồm những điều sau đây:
gem 'delayed_job'
gem "aws-s3", :require => 'aws/s3'
gem 'fog'
gem 'carrierwave'
gem 'carrierwave_direct'
sương mù đá quý là một cách tốt đẹp để có tất cả các thông tin tài khoản của bạn ở một nơi duy nhất và thiết lập tất cả mọi thứ khá độc đáo. Đối với đá quý AWS how-to, tài nguyên tốt.
Đây là một bộ điều khiển mẫu khi nộp một mẫu đơn để tải lên (có những cách chắc chắn tốt hơn để làm điều này, nhưng đối với mục đích minh họa)
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
Rất nhiều mã không cần thiết, tôi biết (viết này khi tôi đã bắt đầu với Rails). Hy vọng rằng nó sẽ cung cấp cho một số ý tưởng về các quy trình liên quan đến việc viết loại ứng dụng này. Hy vọng nó giúp.