在Rails中上传文件

max*_*ax_ 71 ruby file-io file-upload ruby-on-rails

我是rails的新手,我正在使用CRUD技术编写一个RESTful网站.到目前为止,我已经创建了三个页面,所有这些页面都允许用户从数据库中创建,编辑和删除行.但是,我的第四页需要包含一个上传文件表单,但是a)我不知道文件系统如何与Rails一起工作,因此我不知道文件应该存储在哪里.该文件大约为100kb,无法存储在临时存储中,因为它会不断下载.并且b)我不知道如何写入文件.

如果您能告诉我如何执行上面提到的操作会很棒 - 在输入表单上创建上传输入,然后将文件写入单独目录中的文件路径.

fab*_*abi 123

更新2018年

虽然下面写的所有内容仍然适用,但Rails 5.2现在包括active_storage,允许直接上传到S3(或其他云存储服务),图像转换等内容.您应该查看rails指南并自行决定适合您的需求.


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

file_field在表单中使用-form helper,rails会为您处理上传:

<%= form_for @person do |f| %>
  <%= f.file_field :picture %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

这取决于您想要实现的复杂程度,但这足以轻松上传/下载文件.这个例子来自rails指南,你可以去那里获取更多信息:http://guides.rubyonrails.org/form_helpers.html#uploading-files

  • 请编辑代码以使用`wb`而不仅仅是`w`,或者对于具有非ascii字符的文件,上传可能会失败. (7认同)
  • 不,实际上代码只将它写入文件系统,而不是写入数据库.实际上,您仍然需要以某种方式将文件与数据库记录相关联(例如,通过将上载文件的文件名设置为记录的id).您可以查看ruby文档以获取有关`File.open`(http://www.ruby-doc.org/core-1.9.3/File.html#method-c-open)的更多信息. (6认同)
  • 我不想将文件写入数据库,只是文件路径,您提供的代码不会将其写入活动记录吗? (3认同)

Ahm*_*ssy 5

2018年9月

对于最近检查此问题的任何人,Rails 5.2+现在默认都有ActiveStorage,我强烈建议您检查一下。

由于它现在是Rails 5.2+核心的一部分,因此它具有很好的集成性并具有出色的开箱即用功能(尽管所有其他著名的宝石,如Carrierwave,Shrine,回形针等,都很棒,但是这提供了非常出色的功能)我们可以在任何新的Rails项目中考虑的良好功能)

回形针团队不赞成使用Gems,而是使用Rails ActiveStorage。

这是ActiveStorage的github页面,到处都有大量资源

另外,我发现该视频对于了解Activestorage的功能非常有帮助