ruby-on-rails – 使用Carrierwave直接上传到S3
我最近将以下内容从使用Paperclip转换为Carrierwave上传到Amazon S3,因此我可以使用carrierwave_direct gem,然后使用Sidekiq或其他后台处理gem.
class Release < ActiveRecord::Base has_many :releases_tracks,:dependent => :destroy has_many :tracks,:through => :releases_tracks,:order => "releases_tracks.position DESC" accepts_nested_attributes_for :tracks,:reject_if => lambda { |a| a[:name].blank? },:allow_destroy => :true accepts_nested_attributes_for :releases_tracks end class Track < ActiveRecord::Base mount_uploader :track,TrackUploader has_many :releases_tracks,:dependent => :destroy has_many :releases,:through => :releases_tracks end /views/releases/track_upload.html.erb <%= form_for(@release,:html => { :multipart => true }) do |f| %> <h3>Upload Tracks for <%= @release.title %></h3> <% index = 0 %> <%= f.fields_for :tracks do |builder| %> <%= @release.tracks[index].name %> <%= f.file_field :track,:class => "file styled",:title => 'Select Track'%> <% index += 1 %> <% end %> <%= f.submit "Upload Tracks",:class => "submit" %> <% end %> Carrierwave上传工作正常,但我无法弄清楚如何让直接部分工作.部分是因为我无法弄清楚如何合并建议的表单代码: <%= direct_upload_form_for @uploader do |f| %> <%= f.file_field :track %> <%= f.submit %> <% end % 或者在我的轨道或释放控制器的位置我放置建议: @uploader = User.new.track @uploader.success_action_redirect = new_user_url 自述文件https://github.com/dwilkie/carrierwave_direct和Railscast http://railscasts.com/episodes/383-uploading-to-amazon-s3都指向先上传文件然后创建数据库条目.在我的应用程序中,db条目已存在. Railscast确实说它有可能但不会经历它.这是第一个问题. 第二是我需要一次上传多个文件.上面的代码确实实现了这一点,但速度非常慢,它当然会让我的应用程序变得毫无用处. 有人可以帮忙吗?非常感谢提前! 解决方法
首先,我建议你不要使用carrierwave_direct,我真的不喜欢这个宝石,原因有很多.
其中一个原因是,正如文档中所述
但是如果你想使用它,我猜你必须这样做: 首先是关于 @uploader = User.new.track @uploader.success_action_redirect = new_user_url 您似乎正在尝试上传曲目,正如您所说,您的模型已经创建,我想您正在尝试为现有版本上传新曲目.如我错了请纠正我. 所以你应该在ReleasesController的#track_upload方法中创建@uploader var. class ReleasesController ... def track_update @uploader = User.new.track @uploader.success_action_redirect = new_user_url end ... end 然后在关联视图(/views/releases/track_upload.html.erb)中,您可以使用direct_upload_form <%= direct_upload_form_for @uploader do |f| %> <%= f.file_field :track %> <%= f.submit %> <% end %> 在您选择文件后,表单将文件直接上传到s3.然后我不确切知道怎么做,但是carrierwave_direct会给你回上传文件的url. 无论如何,因为你想上传多个文件,我想指向你一个tutorial I recently wrote 这显示了如何在没有carrierwave_direct的情况下直接将文件上传到s3,而是通过自己做事情.这需要更多的代码和时间,但您可以更好地控制正在发生的事情. 在您的情况下,您需要在视图中的/views/releases/track_upload.html.erb视图中将我正在使用的表单放在您的教程中. 这样做的好处是,如果您只是在文件输入中添加多个,那么真棒jQueryFileUpload插件会将每个文件的请求发送到s3,然后您将获得每个ajax结果中上传文件的URL:D 你可以通过jQuery插件调整添加进度条和类似的东西,你可以真正创建出色的东西. 希望它能帮到你! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |