Отправить несколько файлов, используя HTTParty - PullRequest
6 голосов
/ 17 мая 2019

Вот код, который работает с использованием Net::HTTP::Post

request = Net::HTTP::Post.new(url)
...
form_data = [
  ['attachments[]', File.open('file1.txt')],
  ['attachments[]', File.open('file2.txt')]
]
request.set_form form_data, 'multipart/form-data'
http.request(request)

Теперь я пытаюсь использовать httparty, как показано ниже, но он не работает.

body = { attachments: [ File.open('file1.txt'), File.open('file2.txt') ] }

HTTParty.post(url, body: body)

Ответ, который я получаю от вызова веб-службы, приведен ниже:

#<HTTParty::Response:0x557d7b549f90 parsed_response={"error"=>true, "error_code"=>"invalid_attachment", "error_message"=>"Attachmen
t(s) not found or invalid."}, @response=#<Net::HTTPBadRequest 400 Bad Request readbody=true>, @headers={"server"=>["nginx"], "date"=>[
"Mon, 20 May 2019 07:41:50 GMT"], "content-type"=>["application/json"], "content-length"=>["102"], "connection"=>["close"], "vary"=>["
Authorization"], "set-cookie"=>["c18664e1c22ce71c0c91742fbeaaa863=uv425hihrbdatsql1udrlbs9as; path=/"], "expires"=>["Thu, 19 Nov 1981
08:52:00 GMT", "-1"], "cache-control"=>["no-store, no-cache, must-revalidate", "private, must-revalidate"], "pragma"=>["no-cache", "no
-cache"], "x-ratelimit-limit"=>["60"], "x-ratelimit-remaining"=>["59"], "strict-transport-security"=>["max-age=63072000; includeSubdom
ains;"]}>

Похоже, что он не может прочитать содержимое файлов.HTTParty поддерживает это или мне нужно использовать какой-нибудь другой драгоценный камень?

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

С HTTParty вы можете передавать IO / Files в качестве параметров таким же образом (multipart автоматически устанавливается в значение true, если в параметрах есть файл).

Но имейте в виду, что файлы должны быть закрыты после загрузки, иначе вы можете исчерпать файловые дескрипторы до того, как GC их соберет:

files = ['file1.txt', 'file2.txt'].map{|fname| File.open(fname) }
begin
  HTTParty.post(url, body: { attachments: files })
ensure
  files.each(&:close)
end

Это должно работать для вас, если вариант net / http работает (и фактически совпадает с вашим кодом).

Другая вещь, на которую стоит обратить внимание, это обнаружение типа контента по имени файла - потому что загрузка файла состоит из имени файла, типа контента и самих данных. Ошибка 400 с «invalid_attachment», которую вы получаете, говорит о том, что, скорее всего, она связана с типом контента или другой проверкой на стороне сервера (поэтому убедитесь, что вы тестируете с теми же файлами и ничего не меняется, кроме http lib), также проверьте httparty быть последней версией

0 голосов
/ 17 мая 2019

Что-то вроде этого должно работать, я только что проверил, работало для меня без проблем.

HTTParty.post(url, 
              body: { attachments: [ 
                   File.read('foo.txt'), 
                   File.read('bar.txt')] })
...