#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, на что я в итоге и согласился.