ruby-on-rails - rails 5 : Join 2 large text files

标签 ruby-on-rails linux

在我的 Rails 应用程序中,客户端通过 API 以 block (100 kB - 5 MB)的形式上传文件。 (它在 API 上重复使用相同的 HTTP POST 请求上传每个 block )。

在服务器端,我通过从上传移动临时文件将第一个上传的文件存储在特定目录中:

 tmp = params[:file_pack].tempfile
 path = '/xxx/xxx.txt'

 FileUtils.move tmp.path, path

接下来,我想将其他 block (第二个、第三个等)附加到第一个 block 的末尾,这些 block 是通过 HTTP 发出的下一个请求。所以我想将所有 block 收集到一个文件中。

将一个文件附加到另一个大文件末尾的最有效方法是什么?

似乎最流行的方法是使用 File.open(path, "a"),但这是最有效的方法吗?这是 File.open 将整个文件加载到内存中吗?

最佳答案

为了将一些文件附加到另一个文件的末尾,我使用了:

File.open(path, 'a') { |f| f << params[:file_pack].tempfile.read }

在哪里

  • path 是目标文件的路径

  • a 表示指针在文件末尾(如果文件不存在,应该创建它)

  • params[:file_pack] 是通过 HTTP 上传到 API 的文件

  • .tempfile 允许访问临时上传的文件

    我已经通过将大小为 29B 的文件添加到大小为 279MB 的文件来测试它并且它运行得非常快。我没有做更详细的测试,但我希望这个总结对某人有用。

关于ruby-on-rails - rails 5 : Join 2 large text files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38714712/

相关文章:

ruby-on-rails - 将 devise_token_auth 与 jsonapi-resources 结合使用

linux - iwconfig - 通过终端上的 wifi 连接网络

php - Laravel 5.2 - 如何通过 Modal/Controller 运行 shell 命令

css - 歧义匹配,找到 2 个匹配 css 的元素 - Capybara

ruby-on-rails - 开发中的 SQLite,生产中的 PostgreSQL——为什么不呢?

ruby-on-rails - ruby on rails,由于 bcrypt_ext (LoadError),运行服务器不工作

ruby-on-rails - 第 8 章 Rails 教程记住 token 错误

linux - Golang 中的 slice 导致空白终端和困惑的线程

linux - 在 gnome-terminal -x 中运行 bash 函数

linux - Git 符号链接(symbolic link) - Windows 工作站 - Linux 服务器