使用Carrierwave直接上传到S3

我最近将以下内容从使用Paperclip转换为Carrierwave上传到Amazon S3,因此我可以使用carrierwave_direct gem,然后使用Sidekiq或其他后台处理gem。

class Release  :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  :destroy has_many :releases, :through => :releases_tracks end 

/views/releases/track_upload.html.erb

  { :multipart => true }) do |f| %> 

Upload Tracks for

"file styled", :title => 'Select Track'%> "submit" %>

Carrierwave上传工作正常,但我无法弄清楚如何让直接部分工作。 部分是因为我无法弄清楚如何合并建议的表单代码:

    <% 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,我真的不喜欢这个gem,原因有很多。 其中一个原因是,正如文档中所述

请注意,此gem仅支持单个文件上传。 如果您想同时上传多个文件,则必须使用javascript或flash上​​传程序。

但是如果你想使用它,我猜你必须这样做:

首先是关于

 @uploader = User.new.track @uploader.success_action_redirect = new_user_url 

您似乎正在尝试上传曲目,正如您所说,您的模型已经创建,我想您正在尝试为现有版本上传新曲目。 如我错了请纠正我。

所以你应该在@uploader#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。 我不确定,因为我从来没有这么远,但是想法是你的文件刚刚上传到s3,现在它必须链接到你的模型,所以文件不会丢失”。 所以也许carrierwave_direct通过做一些ajax请求或其他任何事情来自己做事(我怀疑……)。

无论如何,因为你想上传多个文件,我想指出你最近写的一个教程

这显示了如何在没有carrierwave_direct的情况下直接将文件上传到s3,而是通过自己做事。 这需要更多的代码和时间,但您可以更好地控制正在发生的事情。

在您的情况下,您需要在视图中的/views/releases/track_upload.html.erb视图中将我正在使用的表单放在您的教程中。 然后,一旦你选择了一个文件,成功的AJAX请求(由jQueryFileUpload插件发出)将为你提供上传文件的URL,这样你就可以将它保存在Track模型中(你可能想要发出一个新的AJAX请求)在您的服务器上创建新的Track模型,或填充页面上的其他表单,如您在/views/releases/track_upload.html.erb文件中使用的表单,然后将在提交时保存曲目。 )我不确定我是否真的很清楚,如果你需要更多解释,请告诉我。

这样做的好处是,如果您只是在文件输入中添加multiple ,那么真棒的jQueryFileUpload插件会将每个文件的请求发送到s3,然后您将获得每个ajax结果中上传文件的URL:D

你可以通过jQuery插件调整添加进度条和类似的东西,你可以真正创建出色的东西。

希望它能帮到你!