2

我有一个文件从另一个网站进入我的 Rails 应用程序。POST 数据如下所示:

Parameters: {"file"=>#<ActionDispatch::Http::UploadedFile:0x007fa03cf0c8d0 @original_filename="Georgia.svg", @content_type="application/octet-stream", @headers="Content-Disposition: form-data; name=\"file\"; filename=\"Georgia.svg\"\r\nContent-Type: application/octet-stream\r\n", @tempfile=#<File:/var/folders/g0/m3jlqvpd4cbc3khznvn5c_7m0000gn/T/RackMultipart20130507-52672-1sw119a>>, "originalFileName"=>"Georgia.ttf"}

我的控制器代码是这样的:

def target     
  @incoming_file = params[:file]
  file_name = params[:originalFileName]
  File.open("/Users/my_home_directory/#{file_name}", "w+b") {|f| f.write(@thing)} 
end

现在,我可以在我的硬盘驱动器上创建一个文件,其中包含一行显示该对象的文本。

这是在我的硬盘驱动器中创建的文件中的代码。

<ActionDispatch::Http::UploadedFile:0x007fa03cd1c318>

我可以用上传文件的名称写一个文件。我似乎无法弄清楚如何将文件中的数据写入我的驱动器。我是 ruby​​ on rails 的新手。帮我看看我错过了什么。谢谢。

4

2 回答 2

14

显而易见的解决方案是 Richie Min 建议的解决方案,但就内存使用而言,这是一个糟糕的解决方案,如果您开始上传大文件,这可能会变得至关重要。自从

File.open(...) {|f| f.write(@incoming_file.read)}

使用 .读取内存中的整个上传文件@incoming_file.read。更好的选择是:

def target
  @incoming_file = params[:file]
  file_name = params[:originalFileName]
  FileUtils.mv @incoming_file.tempfile, "/Users/my_home_directory/#{file_name}"
end

上传的数据始终存储在临时文件中,UploadedFile.read实际上只是实际 File 对象的代理,可以通过 trough 访问UploadedFile.tempfile。但是,如果临时文件夹和目标目录位于不同的分区甚至不同的磁盘驱动器上,这也可能不是最佳解决方案,但仍然比在 Rails 控制器中读取内存中的整个文件要好得多。

您可以使用以下方法对其进行测试:

curl -X POST -F file=@[some large file] -F originalFileName=somefilename.ext http://[your url]
于 2013-05-08T05:17:59.953 回答
1

利用

File.open("/Users/my_home_directory/#{file_name}", "w+b") {|f| f.write(@incoming_file.read)}

于 2013-05-08T03:25:39.270 回答