在我的Rails应用程序中,客户端通过API上传文件(100 kB - 5 MB)。 (它在API上重复使用相同的HTTP POST请求上传每个块)。
在服务器端,我将第一个上传的文件存储在特定目录中,方法是从上传中移动tempfile:
tmp = params[:file_pack].tempfile
path = '/xxx/xxx.txt'
FileUtils.move tmp.path, path
接下来,我想追加其他块(第二个,第三个等) - 通过HTTP进入下一个请求 - 到第一个块的末尾。所以我想在一个文件中收集所有块。
将一个文件追加到另一个大文件末尾的最有效方法是什么?
似乎最流行的方式是使用File.open(path, "a")
,但它是最有效的方式吗?这个File.open
是否将整个文件加载到内存中?
答案 0 :(得分:1)
要将某个文件附加到另一个文件的末尾,我使用了:
File.open(path, 'a') { |f| f << params[:file_pack].tempfile.read }
,其中
path
是目标文件的路径a
表示指针位于文件末尾(如果文件不存在,则应该创建它)params[:file_pack]
是通过HTTP上传到API的文件 .tempfile
可以访问临时上传的文件
我通过将大小为29B的文件添加到文件大小为279MB来测试它,它的工作速度非常快。我没有做过更详细的测试,但我希望这个摘要对某些人有用。