繁体   English   中英

如何获得此ruby on rails应用程序将文件复制到硬盘驱动器?

[英]How do I get this ruby on rails app to copy a file to my hard drive?

我有一个文件从另一个网站进入我的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>

我可以写一个带有上载文件名的文件。 我似乎无法弄清楚如何将文件中的数据写入驱动器。 我是红宝石的新手。 帮我看看我在想什么。 谢谢。

最明显的解决方案是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对象的代理,可通过UploadedFile.tempfile访问。 但是,如果临时文件夹和目标目录位于不同的分区或什至位于不同的磁盘驱动器上,这也不是最佳的解决方案,但仍然比在Rails控制器中读取内存中的整个文件要好得多。

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

curl -X POST -F file=@[some large file] -F originalFileName=somefilename.ext http://[your url]

采用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM