2016-08-02 2 views
1

В моем приложении Rails клиент загружает файлы в куски (100 кБ - 5 МБ) через API. (Он загружает каждый фрагмент, используя повторно тот же HTTP-запрос POST по API).Rails 5: объединение 2 больших текстовых файлов

На серверной стороне, я храню первый загруженный файл в определенном каталоге, путем перемещения временных файлов от загрузки:

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

FileUtils.move tmp.path, path 

Далее, я хочу, чтобы добавить другие куски (второй, третий и т.д.) - whioch приходит в следующий запрос по HTTP - до конца этого первого фрагмента. Поэтому я хочу собрать все куски в одном файле.

Каков наиболее эффективный способ добавления одного файла в конец другого большого файла?

Похоже, что наиболее популярным способом является использование File.open(path, "a"), но является ли это наиболее эффективным способом? Это File.open загрузить весь файл в память?

ответ

1

Для добавления какой-либо файл в конце другого, я использовал:

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

где

  • path это путь к файлу назначения
  • a означает, что указатель находится в конец файла (если файл не существует, он должен его создать)
  • params[:file_pack] - это загруженный файл через HTTP до API
  • .tempfile предоставляет доступ к временным Загруженный файл

    Я проверил его, добавив файл с размером 29В в файл с размером 279MB и она работает очень быстро. Я не делал более подробного тестирования, но я надеюсь, что это резюме будет полезно для кого-то.

+0

Интересно, что является более эффективным/подходит на Linux - ваш метод или эта команда оболочки (выполнена из рубина) '% х (кошка chunk.txt >> file.txt)' – user1201917

+0

Я проверил это вручную и я думаю, что операция 'cat' занимает больше времени, но я не делал для этого подробных эталонных тестов, поэтому исправьте меня, если я ошибаюсь. – nicq

Смежные вопросы