Ruby on rails 在Rails中上载文件
我是rails新手,我正在使用CRUD技术编写一个RESTful网站。到目前为止,我已经创建了三个页面,所有这些页面都允许用户从数据库中创建、编辑和删除一行。然而,我的第四页需要包含一个上传文件表单,但是a)我不知道文件系统如何与Rails一起工作,因此我不知道文件应该存储在哪里。该文件大约为100kb,无法存储在临时存储器中,因为它将不断下载。b)我不知道如何写入文件Ruby on rails 在Rails中上载文件,ruby-on-rails,ruby,file-upload,file-io,Ruby On Rails,Ruby,File Upload,File Io,我是rails新手,我正在使用CRUD技术编写一个RESTful网站。到目前为止,我已经创建了三个页面,所有这些页面都允许用户从数据库中创建、编辑和删除一行。然而,我的第四页需要包含一个上传文件表单,但是a)我不知道文件系统如何与Rails一起工作,因此我不知道文件应该存储在哪里。该文件大约为100kb,无法存储在临时存储器中,因为它将不断下载。b)我不知道如何写入文件 如果您能告诉我如何执行上面提到的操作,那就太好了——在输入表单上创建上载输入,然后将文件写入单独目录中的文件路径。有一个很好的
如果您能告诉我如何执行上面提到的操作,那就太好了——在输入表单上创建上载输入,然后将文件写入单独目录中的文件路径。有一个很好的gem,专门用于上载文件:。如果维基没有帮助,那么有一个关于使用它的最佳方式的问题。总之,Rails表单中有一个字段类型
file
,它调用文件上传对话框。您可以使用它,但“魔法”是由carrierwave
gem完成的
我不知道“如何写入文件”是什么意思,但我希望这是一个好的开始 2018年更新 虽然下面所写的一切都是正确的,但Rails 5.2现在包含了
活动存储
,它允许直接上传到S3(或其他云存储服务)、图像转换等内容。您应该查看并自行决定适合您需要的内容
虽然有很多gem可以很好地解决文件上传问题(请参阅列表),但是rails有内置的助手,可以轻松地推出自己的解决方案 在表单中使用
文件\u字段
-表单帮助器,rails为您处理上传:
<%= form_for @person do |f| %>
<%= f.file_field :picture %>
<% end %>
这取决于您想要实现的目标的复杂性,但这对于简单的文件上传/下载任务来说已经足够了。此示例取自rails指南,您可以到那里了解更多信息:2018年9月 对于最近检查此问题的任何人
因为它是核心轨道5.2 +现在的一部分,它是很好的集成的,并且有很好的性能(仍然是所有其他著名的宝石,如CaveRew,神龛,纸夹,……很棒,但是这一个提供了非常好的特性,我们可以考虑任何新的Rails项目)
回形针团队不推荐gem,而支持Rails ActiveStorage &到处都有大量可用的资源非常有助于理解Activestorage的功能好的。如果您不想将文件存储在数据库中并存储在应用程序中,如资产(自定义文件夹),则可以定义由attr\u accessor:document定义的非db实例变量,并使用
form\u for-f.file\u字段
获取文件
在控制器中
@person = Person.new(person_params)
此处person\u 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
&如果要再次使用此文件,请通过application.rb将此路径添加到应用程序的asset\u路径
每当窗体读取文件字段时,它都会存储在tmp文件夹中,以后可以存储在您的位置,我给出了存储在资产的示例
注意:这样存储文件会增加应用程序的大小,最好使用Intializer/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
在本地运行时,使用此选项存储在文件中我明白了,因此您可以使用tis gem。不过,我不想将文件写入数据库,只是文件路径,您提供的代码不会将其写入活动记录吗?不,实际上,代码只将其写入文件系统,而根本不会写入数据库。事实上,您仍然需要以某种方式将文件与数据库记录相关联(例如,通过将上载文件的文件名设置为记录的id)。您可以查阅ruby文档以了解有关文件的更多信息。打开()。请编辑代码以使用wb
,而不是仅使用w
,否则对于具有非ascii字符的文件,上载可能会失败。新的控制器方法中有什么内容?@KarolSelak此示例仅提供了简单文件上载的概述,您可以在rails指南(/)中了解有关布线和表单的更多信息
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