我有一个应用程序,用户可以上传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中为我的存储桶设置了适当的环境变量。这就是我到目前为止所做的一切......真的输了。
答案 0 :(得分:2)
我不知道这是否会有所帮助,但它可能会给你一些想法
<强>回形针强>
我们团队使用Rails上传文件的方式是使用惊人的Paperclip
gem。我之所以提到这一点,是因为Paperclip不仅与S3集成,而且还为您提供了一种正确管理文件的核心方式
Paperclip与ActiveRecord(您的数据库)一起存储文件信息。然后,您可以在Paperclip的配置选项中定义文件的存储位置(包括S3)。这意味着,如果您要上传.csv文件&amp;允许用户更改它,使用Paperclip之类的东西将帮助您正确地保持正确
虽然您可能会或可能不会受益于Paperclip,但这里概述了它的工作原理:
使用回形针上传
有一个很好的Railscast about Paperclip here
以下是如何使其发挥作用:
#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;我们可以努力在您的应用中实现它