我可以在Rails中保存上传的文件?

问题描述:

我试图在Rails中找到处理文档的文件,但没有成功。这里是File类的链接(由file_filed_tag的文档指定): http://api.rubyonrails.org/classes/File.html我可以在Rails中保存上传的文件?

我想这应该是一组更好的源文档。我的主要问题是我可以在哪里保存一个不可公开访问的文件。我有兴趣临时使用文件上传的文件作为用户的目的“向导”。

+0

如果你想让它访问在Heroku上,你可以使用的资源文件夹 – ahmet 2013-05-05 10:30:15

Rails的文档只mentions this in passing ,处理上载源是https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/http/upload.rb

你可以使用宝石“回形针”来处理你的文件上传:

https://github.com/thoughtbot/paperclip

常规是将您上传的文件存储在公共/系统中,回形针中的默认 配置为:

:rails_root/public/system/:class/:attachment/:id_partition/:style/:filename 

,但如果你想保持它公开,你可以将其更改为另一主文件夹:

:rails_root/private/:class/:attachment/:id_partition/:style/:filename 
+0

感谢您链接到模块源。我期待更多的文档,无论是传统还是技术。我意识到回形针的宝石,我想感受Rails的本地人?首先上传。 – chrisp 2013-05-05 19:35:07

Rails的处理文件上传就像任何web框架:它留下文件上传的处理到您正在使用的Web服务器(Apache,Nginx等)。然后,当文件上传完成时,它会为您的框架提供上传文件的位置(通常是临时文件)(以及诸如MIME类型的内容)。您需要决定如何处理该文件。 Rails通过在你的控制器中提供一个Ruby文件对象来实现这一点。

如果您使用像“paperclip”这样的gem,它可以让您更多地控制文件,而不是自己处理文件,您可以自动调整图像大小或其他上传后的挂钩,真的很值得研究。

如果您选择自己做,则需要使用File对象(临时文件)并将其写入其他位置的控制器代码。所以,如果你有一个多部分Web表单,需要一个文件:

<%= form_tag({:action => :upload}, :multipart => true) do %> 
    <%= file_field_tag 'picture' %> 
<% end %> 

你会最终在你的PARAMS哈希picture对象:

params[:picture] 

这是临时文件。 Rails提供两个额外的方法来确定原始文件名和MIME类型:

params[:picture].original_filename 
params[:picture].content_type