Ruby on rails 不带activerecord的文件上载

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

如何处理rail中的文件上载而不将其附加到活动记录?
我只想把文件写到磁盘上


谢谢,

您可以尝试使用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”)
来创建
目录
?当然,这是一个很好的提示。很久以前写过:)当时我不知道该怎么做:)只是在编码时使用了示例,所以在一行中我使用它:)在另一行中我不知道。现在更新。试试这个