我最近将以下内容从使用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确实说它有可能但不会经历它。这是第一个问题。
第二个是我需要一次上传多个文件。上面的代码实现了这一点,但速度非常慢,当然它会使我的应用程序变得毫无用处。
有人可以帮忙吗?非常感谢提前!
答案 0 :(得分:20)
首先,我建议你不要使用carrierwave_direct,我真的不喜欢这个宝石,原因有很多。 其中一个原因是,正如文档中所述
请注意,此宝石仅支持单曲 文件上传。如果要同时上载多个文件 你必须使用javascript或flash上传器。
但是如果你想使用它,我猜你必须这样做:
首先关于
@uploader = User.new.track
@uploader.success_action_redirect = new_user_url
您似乎正在尝试上传曲目,正如您所说,您的模型已经创建,我想您正在尝试为现有版本上传新曲目。如果我错了,请纠正我。
所以你应该在@uploader
的{{1}}方法中创建#track_upload
var。
ReleasesController
然后在关联视图(/views/releases/track_upload.html.erb)中,您可以使用direct_upload_form
class ReleasesController
...
def track_update
@uploader = User.new.track
@uploader.success_action_redirect = new_user_url
end
...
end
在您选择文件后,表单会将文件直接上传到s3。然后我不知道究竟是怎么回事,但是carrierwave_direct会给你回复上传文件的网址。 我不确定,因为我从来没有这么远,但是我的想法是你的文件刚上传到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文件中使用的表单一样,然后在提交时保存曲目。 ) 我不确定我是否真的很清楚,如果你需要更多解释,请告诉我。
好消息是,如果您只是将<%= direct_upload_form_for @uploader do |f| %>
<%= f.file_field :track %>
<%= f.submit %>
<% end %>
添加到文件输入中,那么真棒jQueryFileUpload插件会将每个文件的请求发送到s3,然后您将获得该URL每个ajax结果中上传的文件:D
你可以通过jQuery插件来调整添加进度条,以及类似的东西,你可以真正创建出色的东西。
希望它能帮到你!