在Rails中上传文件(Uploading a file in Rails)

2019-07-17 21:22发布

我是新的轨道,和我使用的CRUD技术写一个RESTful网站。 到目前为止,我已经创建了三个页面,所有这些都允许用户创建,编辑,并从数据库中删除行。 然而,我的第四页将需要包括上传文件的形式,但)我不知道这个文件使用Rails是如何工作的。因此,我不知道在哪里的文件应存放。 该文件将约为100KB,不能存储在临时存储,因为它会不断下载。 和b)我不知道如何写一个文件。

这将是巨大的,如果你能告诉我怎么做我上面提到的 - 输入表单上创建一个上传的输入,并随后将文件写入文件路径在一个单独的目录。

Answer 1:

更新2018

虽然一切都写在下面仍然是成立的,Rails的5.2现在包括active_storage ,允许类的东西直接上传到S3(或其他云存储服务),图像变换等,您应该检查导轨导向 ,并决定自己是什么适合您的需要。


虽然有很多能够解决文件上传很漂亮(见宝石https://www.ruby-toolbox.com/categories/rails_file_uploads的列表),导轨具有内置的助手,这使得它很容易推出自己的解决方案。

使用file_field在你的形式-形式帮手,和Rails处理上传为您提供:

<%= form_for @person do |f| %>
  <%= f.file_field :picture %>
<% end %>

您将在控制器上载的文件访问,如下所示:

uploaded_io = params[:person][:picture]
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file|
  file.write(uploaded_io.read)
end

这取决于你想要达到什么样的复杂性,但这是很容易的文件上传/下载任务完全足够了。 这个例子是从轨道拍摄指南,你可以去那里了解更多信息: http://guides.rubyonrails.org/form_helpers.html#uploading-files



Answer 2:

2018年9月

对于任何最近检查这个问题, Rails的5.2 +现在已经ActiveStorage默认与我强烈建议检查出来。

既然是5.2+现在,这是很好的集成和具有开箱即用(还是其他知名的宝石一样Carrierwave,神殿,回形针,出色的能力,Rails核心的一部分......是伟大的,但这个提供了非常我们可以考虑任何新的Rails项目好等特点)

回形针团队支持Rails的ActiveStorage的过时的宝石。

下面是ActiveStorage GitHub的页面和丰富的资源,可随处使用

此外,我发现这个视频是非常有助于了解Activestorage的特点



Answer 3:

有一个很好的创业板尤其是对上传文件: carrierwave 。 如果维基没有帮助,有一个很好的RailsCast关于使用它的最佳方式。 总之,有一个字段类型file在Rails的形式,这将调用文件上传对话框。 您可以使用它,但“魔力”被做carrierwave宝石。

我不知道你是什么意思与“如何写一个文件”,但我希望这是一个良好的开端。



Answer 4:

好的。 如果你不想在数据库和存储的文件存储在应用程序,如资产(自定义文件夹),你可以定义attr_accessor定义的非数据库实例变量:文档和使用form_for - f.file_field获取文件,

在控制器,

 @person = Person.new(person_params)

这里person_params返回白名单的params[:person] (自己定义的)

文件另存为,

dir = "#{Rails.root}/app/assets/custom_path"
FileUtils.mkdir(dir) unless File.directory? dir
document = @person.document.document_file_name # check document uploaded params
File.copy_stream(@font.document, "#{dir}/#{document}")

请注意,在添加此路径.gitignore &如果你想使用此文件再次添加此路径asset_path一个由应用程序的application.rb

每当构成读文件中的字段,它得到店TMP文件夹中,以后你可以在你的地方存放,我给例如存储在资产

注意 :这样的存储文件会增加应用程序的大小,使用更好的数据库来存储paperclip



文章来源: Uploading a file in Rails