Буферизованные многостраничные сообщения формы в Ruby

В настоящее время я использую Net::HTTP в сценарии Ruby для публикации файлов на веб-сайте через многостраничную форму публикации. Он отлично работает с небольшими файлами, но мне часто приходится отправлять очень большие файлы с помощью этого сценария, а HTTP#post, кажется, принимает только почтовые данные как объект String, что означает, что отправляемый файл должен быть прочитан в память, прежде чем что-либо можно отправить. Этот сценарий выполняется на загруженном производственном сервере, поэтому недопустимо поглощать сотни мегабайт оперативной памяти только для того, чтобы отправить файл.

В идеале был бы метод, которому можно было бы задать размер буфера и объект IO, и который бы отправлял фрагменты данных размером с буфер, считывая из объекта IO только по мере необходимости. Как лучше всего добиться этого? Пропустил ли я что-то актуальное в Net::HTTP?

Обновлять: Net::HTTP#body_stream(input) выглядит неплохо, хотя документация довольно ... скудная. Кто-нибудь может указать мне на хороший пример этого в действии?

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
0
1 538
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте Net :: HTTP # body_stream (ввод)

Пример для составной пост без потоковой передачи:

Эта ссылка не работает

adaam 10.02.2017 16:28

На самом деле мне удалось загрузить файл с помощью body_stream. Полный исходный код находится здесь: http://stanislavvitvitskiy.blogspot.com/2008/12/multipart-post-in-ruby.html

В конечном итоге я просто покопался в исходном коде Net / HTTP, чтобы понять, как использовать body_stream, что было настоящей головной болью. Изменения, которые я внес в составной код, который я опубликовал в ответ на этот другой вопрос, в конечном итоге очень похожи на ваши. Жаль, что это не встроено.

Cody Brimhall 09.01.2009 22:00

Другие вопросы по теме