Ruby on rails 不带activerecord的文件上载
如何处理rail中的文件上载而不将其附加到活动记录?Ruby on rails 不带activerecord的文件上载,ruby-on-rails,Ruby On Rails,如何处理rail中的文件上载而不将其附加到活动记录? 我只想把文件写到磁盘上 谢谢,您可以尝试使用Rails插件处理文件上传。它允许您将上载内容保存到文件系统而不是数据库。如果我正确理解您的需要,那么最简单的示例是: 控制员: class UploadController < ApplicationController def new end def create name = params[:upload][:file].original_filename
我只想把文件写到磁盘上
谢谢,您可以尝试使用Rails插件处理文件上传。它允许您将上载内容保存到文件系统而不是数据库。如果我正确理解您的需要,那么最简单的示例是: 控制员:
class UploadController < ApplicationController
def new
end
def create
name = params[:upload][:file].original_filename
path = File.join("public", "images", "upload", name)
File.open(path, "wb") { |f| f.write(params[:upload][:file].read) }
flash[:notice] = "File uploaded"
redirect_to "/upload/new"
end
end
class UploadController
观点:
<% flash.each do |key, msg| %>
<%= content_tag :div, msg, :class => [key, " message"], :id => "notice_#{key}" %>
<% end %>
<% form_tag '/upload/create', { :multipart => true } do %>
<p>
<%= file_field_tag 'upload[file]' %>
</p>
<p>
<%= submit_tag "Upload" %>
</p>
<% end %>
[key,“message”],:id=>“注意”{key}”%>
真}do%>
这将允许您上传任何文件,而无需任何检查或验证,在我看来,这并没有多大用处
如果我自己做的话,我会使用类似的东西,或者仅仅是不再支持tableless。这些gem将允许您验证您正在上传的内容,使其更为合理。Tempfile文档显示了一个与Rytis的代码等效的示例,大多数情况下都很好。但是,当您调用
tempfile.read
时,Ruby将整个文件作为单个块读取到内存中,这是次优的
然而,FileUtils
提供了一个copy\u stream
方法,并且至少在Ruby 2.0中,IO
提供了一个实现,可以处理直接写入文件路径的操作(FileUtils.copy\u stream
在两侧都需要类似文件的对象,或者说文档)
在我的例子中,我通过AJAX启动了一个大型多文件上传,并希望避免在写入磁盘之前将整个文件读取到Ruby的内存中
在下面的示例中,params[:files]
是ActionDispatch::Http::UploadedFile
实例的数组,而local_filepath
是指向现有目录中不存在的文件的字符串。为简洁起见,我假设只上载一个文件:
IO.copy_stream(params[:files][0].tempfile, local_filepath)
ActionDispatch::Http::UploadedFile
实例有一个.tempfile
字段,它只是一个常规的tempfile
实例
实际上,我不确定Ruby是否还没有将整个文件读入内存——我没有对任何东西进行基准测试,但这比使用localfile.write(tempfile.read)
语法的可能性要大得多
tl;dr:IO.copy\u stream(您的临时文件、磁盘文件路径)
更简洁,甚至更快。您可以使用FileUtils将临时文件移动到destiny路径
tmp = params[:my_file_field].tempfile
destiny_file = File.join('public', 'uploads', params[:my_file_field].original_filename)
FileUtils.move tmp.path, destiny_file
只需确保在rails 3中使用。为了保持一致,您不应该使用File.join(“public”、“images”、“upload”)
来创建目录
?当然,这是一个很好的提示。很久以前写过:)当时我不知道该怎么做:)只是在编码时使用了示例,所以在一行中我使用它:)在另一行中我不知道。现在更新。试试这个