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

Please be aware that this gem only supports single
file uploads. If you want to upload multiple files simultaneously
you’ll have to use a javascript or flash uploader.

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

首先是关于

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

无论如何,因为你想上传多个文件,我想指向你一个tutorial I recently wrote

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

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

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

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

希望它能帮到你!

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...