【问题标题】:Direct Uploads to S3 using Carrierwave使用 Carrierwave 直接上传到 S3
【发布时间】:2012-10-04 10:00:39
【问题描述】:

我最近将以下内容从使用 Paperclip 转换为上传到 Amazon S3 的 Carrierwave,这样我就可以使用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 都指向首先上传文件,然后创建数据库条目。在我的应用程序中,数据库条目已经存在。 Railscast 确实说这是可能的,但没有通过它。所以这是第一个问题。

第二个是我需要一次上传多个文件。上面的代码确实实现了这一点,但速度很慢,而且它当然会使我的应用程序变得毫无用处。

有人可以帮忙吗?提前致谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.1 amazon-s3 carrierwave


    【解决方案1】:

    首先我建议你不要使用carrierwave_direct,我真的不喜欢这个gem,原因有很多。 其中一个原因是,正如文档中所说的那样

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

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

    所以先说说

    @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

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

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

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

    你可以调整一些东西来添加进度条,像这样使用 jQuery 插件,你真的可以创造出很棒的东西。

    希望对你有帮助!

    【讨论】:

    • 哇,感谢您的出色回答。我认为你的教程更接近我想要实现的目标,所以我现在将完成它。我会反馈我如何处理它。再次感谢!
    • 嗨,Pjam,很棒的教程!我现在正在处理它并且有两个问题。在表单标签中,'data-direct-upload' 应该是 class='data-direct-upload' 吗?另外,我应该将设置表单键值等的 JS 放在哪里?
    • 首先,data 属性只是一种选择表单的方式,如果您愿意,当然可以使用类。然后关于将js放在哪里,没有完美的答案,但我建议创建一个新的js文件direct_upload.js,然后你的清单( application.js )会自动要求你保留require_tree 指令,或者您可以手动要求它。请注意,仅通过类或数据属性或其他任何方式将行为应用于您希望我们直接上传的表单。如果您有任何其他问题,请告诉我!!
    • 只是为了让您知道我对帖子进行了一些修复并回答了一些问题,所以您应该检查一下,它可能会对您有所帮助
    • 我绝对同意你的第一句话。我将永远再次使用carrierwave_direct。我计划在下次需要时从头开始实施一个上传器,并期望它花费更少的时间并且工作得更好。
    猜你喜欢
    • 2012-10-30
    • 2013-08-04
    • 2019-04-05
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    相关资源
    最近更新 更多