81

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

如果您能告诉我如何执行我上面提到的操作,那就太好了 - 在输入表单上创建上传输入,然后将文件写入单独目录中的文件路径。

4

5 回答 5

142

2018 年更新

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


虽然有很多 gem 可以很好地解决文件上传问题(有关列表,请参见https://www.ruby-toolbox.com/categories/rails_file_uploads),但 rails 具有内置帮助程序,可以轻松推出自己的解决方案。

在表单中使用file_field-form 助手,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

这取决于您想要实现的目标的复杂性,但这对于简单的文件上传/下载任务来说已经足够了。这个例子取自 rails guides,你可以去那里获取更多信息: http: //guides.rubyonrails.org/form_helpers.html#uploading-files

于 2013-01-05T17:13:47.800 回答
7

2018 年 9 月

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

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

Paperclip 团队弃用了 gem,转而使用 Rails ActiveStorage。

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

我还发现这个视频对了解 Activestorage 的功能非常有帮助

于 2018-09-21T18:21:19.153 回答
3

有一个很好的宝石,专门用于上传文件:carrierwave。如果 wiki 没有帮助,有一个很好的 RailsCast关于使用它的最佳方法。总而言之,fileRails 表单中有一个字段类型,它调用文件上传对话框。您可以使用它,但“魔法”是由carrierwavegem 完成的。

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

于 2013-01-05T17:08:10.000 回答
0

好的。如果您不想将文件存储在数据库中并存储在应用程序中,例如资产(自定义文件夹),您可以定义 attr_accessor 定义的非db实例变量:文档并使用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.

于 2018-10-23T06:55:20.947 回答
0

在你的初始化器/carrierwave.rb

if Rails.env.development? || Rails.env.test?
    config.storage = :file
    config.root = "#{Rails.root}/public"
    if Rails.env.test?
      CarrierWave.configure do |config|
        config.storage = :file
        config.enable_processing = false
      end
    end
 end

在本地运行时使用它存储在文件中

于 2019-08-20T08:06:10.667 回答