将用户上传的文件发送到rails中的s3

时间:2013-11-26 05:45:04

标签: ruby-on-rails ruby heroku amazon-s3

我有一个应用程序,用户可以上传csv,然后玩数据。现在csv上传到我的rails应用程序的heroku上的公共文件夹,但我想将它发送到s3 b / c heroku对用户上传的文件不好。这是我的控制器中的代码,我将csv直接保存到heroku:

File.open(Rails.root.join(
  'public', 
  'user_files', 
  csv_name + '.csv'
), 'w') do |file|        
    file.write(output_csv_file)
end

如何更改此代码以及我需要在rails中更改的任何其他代码,以便将此文件发送到s3中的aws存储桶?我在我的Gemfiles中安装了'aws-sdk'宝石。我还在heroku中为我的存储桶设置了适当的环境变量。这就是我到目前为止所做的一切......真的输了。

1 个答案:

答案 0 :(得分:2)

我不知道这是否会有所帮助,但它可能会给你一些想法


<强>回形针

我们团队使用Rails上传文件的方式是使用惊人的Paperclip gem。我之所以提到这一点,是因为Paperclip不仅与S3集成,而且还为您提供了一种正确管理文件的核心方式

Paperclip与ActiveRecord(您的数据库)一起存储文件信息。然后,您可以在Paperclip的配置选项中定义文件的存储位置(包括S3)。这意味着,如果您要上传.csv文件&amp;允许用户更改它,使用Paperclip之类的东西将帮助您正确地保持正确

虽然您可能会或可能不会受益于Paperclip,但这里概述了它的工作原理:


使用回形针上传

有一个很好的Railscast about Paperclip here

Paperclip Railscast

以下是如何使其发挥作用:

#app/models/csv.rb
class CSV < ActiveRecord::Base
    has_attached_file :attachment

end

#app/controllers/csv_controller.rb
def create
    @csv = CSV.new(CSV_params)
    @csv.save
end

#app/views/csv/new.html.erb
<%= form_for @csv do |f| %>
    <%= f.file_field :attachment %>
<% end %>

在3处使用Paperclip

有一个很棒的tutorial on Heroku about Paperclip & S3

以下是一些有关如何使用Paperclip处理S3的实时代码:

#app/config/application.rb -> can use /environments/production.rb if you wish
config.paperclip_defaults = {
    :storage => :s3,
    :s3_host_name => 's3-eu-west-1.amazonaws.com'
}

#app/config/models/csv.rb
has_attached_file :image,
                :styles => { :medium => "x300", :thumb => "x100" },
                :default_url => "http://images.apple.com/iphone-5s/home/images/smart_hero.png",
                :storage => :s3,
                :bucket => 'firststop',
                :s3_credentials => S3_CREDENTIALS

这是对如何使用Paperclip使用Rails&amp; S3。如果它听起来像你可以受益的东西,让我知道&amp;我们可以努力在您的应用中实现它