使用HTTParty发送多个文件

时间:2019-05-17 16:11:24

标签: ruby-on-rails ruby web-services httpclient httparty

以下是使用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是否支持此功能,或者我需要使用其他宝石?

3 个答案:

答案 0 :(得分:0)

类似的东西应该可以工作,我刚刚对其进行了测试,对我来说没问题。

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

答案 1 :(得分:0)

使用HTTParty,您可以以相同方式传递IO /文件作为参数(如果参数中有文件,则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变体确实有效(并且实际上与您的代码相同),那么这应该对您有用。

要查看的另一件事是按文件名检测内容类型-因为文件上载由文件名,内容类型和数据本身组成。 您收到的带有“ invalid_attachment”的错误400暗示它很可能与内容类型或服务器端的其他验证有关(因此,请确保您使用相同的文件进行测试,除了http lib之外没有其他更改),还请检查httparty成为最新版本

答案 2 :(得分:0)

我编写了一个测试程序,该程序使用Net::HTTPHTTParty发送相同的多部分请求。然后,它比较并打印请求字符串,以便我们可以比较它们。这两个请求之间的唯一实质性区别是HTTParty尝试猜测并设置Content-Type标头(例如,对于名为 file1.txt 的文件为text/plain),而Net :: HTTP始终使用application/octet-stream

HTTParty确实会读取文件并在请求中发送它们。因此,建议您调查服务器是否由于Content-Type而返回错误(也许不支持您特定请求中的内容类型)。

供您参考,这里是test program and specific results