Многостраничная загрузка RestClient из ввода-вывода

#ruby #http #file-upload #multipart #rest-client

#ruby #http #загрузка файла #многостраничная #rest-клиент

Вопрос:

Я пытаюсь загрузить данные как составные, используя RestClient следующим образом:

 response = RestClient.post(url, io, {
        :cookies => {
          'JSESSIONID' => @sessionid
        }, 
        :multipart => true, 
        :content_type => 'multipart/form-data'
      })
  

io Аргументом является StringIO, который содержит мой файл, поэтому он из памяти, а не с диска.

Сервер (сервлет Tomcat) не может прочитать составные данные, выдавая ошибку:

 org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found
  

Итак, я считаю, что RestClient не отправляет его в формате multipart? Кто-нибудь видит проблему? Я предполагаю, что проблема на стороне Ruby (клиента), но я могу опубликовать свой код сервлета (Spring), если кто-то думает, что это может быть проблема на стороне сервера.

Мне также интересно, что RestClient будет использовать для загруженного имени файла, поскольку фактического файла нет… Может ли у вас быть составной запрос без имени файла?

Ответ №1:

Вы можете это сделать, для этого просто требуется подкласс StringIO и добавление к нему метода пути, отличного от nil:

 class MailIO < StringIO
  def path
    'message'
  end
end
  

Я только что проверил это, и api Mailgun довольно плохо с этим справляется.

Комментарии:

1. Я попробовал этот тип вещей (я изменил класс StringIO, а не расширил его) и в итоге преследовал свой хвост около часа. Возможно, я что-то пропустил…

Ответ №2:

После консультаций с автором библиотеки rest-client (Archiloque) кажется, что если это возможно, API не настроен для легкой обработки. Использование параметра :multipart => true приведет к тому, что ввод-вывод будет обрабатываться как файл, и он ищет ненулевой #путь к вводу-выводу, который для StringIO всегда равен нулю.

Если кому-то это понадобится в будущем, вам нужно будет проконсультироваться со списком рассылки библиотеки (code@archiloque.net ), поскольку автор, по-видимому, считает, что это возможно, но, возможно, не совсем просто.

Он МОЖЕТ легко выполнять потоковую загрузку из ввода-вывода, если это не формат multipart, на что я в итоге и согласился.