首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Faraday上传文件

使用Faraday上传文件
EN

Stack Overflow用户
提问于 2013-05-24 06:53:42
回答 3查看 13.4K关注 0票数 7

我在尝试使用Faraday将文件上传到web服务时遇到问题。

我的代码:

代码语言:javascript
复制
conn = Faraday.new('http://myapi') do |f|
  f.request :multipart
end

payload = { :file => Faraday::UploadIO.new('...', 'image/jpeg') }

conn.post('/', payload)

尝试开机自检后似乎没有任何反应。当我检查响应时,this就是我所看到的:

代码语言:javascript
复制
#<Faraday::Response:0x007fd9e5903870 @env={:method=>:post, :body=>#<Faraday::CompositeReadIO:0x007fd9e5903a50 @parts=[#<Parts::FilePart:0x007fd9e5903e38 @head="-------------RubyMultipartPost\r\nContent-Disposition: form-data; name=\"file\"; filename=\"indymade-badge-horizontal.png\"\r\nContent-Length: 7821\r\nContent-Type: image/png\r\nContent-Transfer-Encoding: binary\r\n\r\n", @foot="\r\n", @length=8026, @io=#<CompositeReadIO:0x007fd9e5903b68 @ios=[#<StringIO:0x007fd9e5903bb8>, #<UploadIO:0x007fd9e514a3b8 @content_type="image/png", @original_filename="indymade-badge-horizontal.png", @local_path="/Users/anthonator/Downloads/indymade-badge-horizontal.png", @io=#<File:/Users/anthonator/Downloads/indymade-badge-horizontal.png>, @opts={}>, #<StringIO:0x007fd9e5903b90>], @index=0>>, #<Parts::EpiloguePart:0x007fd9e5903ac8 @part="-------------RubyMultipartPost--\r\n\r\n", @io=#<StringIO:0x007fd9e5903a78>>], @ios=[#<CompositeReadIO:0x007fd9e5903b68 @ios=[#<StringIO:0x007fd9e5903bb8>, #<UploadIO:0x007fd9e514a3b8 @content_type="image/png", @original_filename="indymade-badge-horizontal.png", @local_path="/Users/anthonator/Downloads/indymade-badge-horizontal.png", @io=#<File:/Users/anthonator/Downloads/indymade-badge-horizontal.png>, @opts={}>, #<StringIO:0x007fd9e5903b90>], @index=0>, #<StringIO:0x007fd9e5903a78>], @index=0>, :url=>#<URI::HTTPS:0x007fd9e5909d60 URL:https://myapi>, :request_headers=>{"User-Agent"=>"Faraday v0.8.7", "Content-Type"=>"multipart/form-data;boundary=-----------RubyMultipartPost", "Content-Length"=>"8062"}, :parallel_manager=>nil, :request=>{:proxy=>nil, :boundary=>"-----------RubyMultipartPost"}, :ssl=>{}, :response=>#<Faraday::Response:0x007fd9e5903870 ...>}, @on_complete_callbacks=[]>
irb(main):065:0> response.inspect
=> "#<Faraday::Response:0x007fd9e5903870 @env={:method=>:post, :body=>#<Faraday::CompositeReadIO:0x007fd9e5903a50 @parts=[#<Parts::FilePart:0x007fd9e5903e38 @head=\"-------------RubyMultipartPost\\r\\nContent-Disposition: form-data; name=\\\"file\\\"; filename=\\\"indymade-badge-horizontal.png\\\"\\r\\nContent-Length: 7821\\r\\nContent-Type: image/png\\r\\nContent-Transfer-Encoding: binary\\r\\n\\r\\n\", @foot=\"\\r\\n\", @length=8026, @io=#<CompositeReadIO:0x007fd9e5903b68 @ios=[#<StringIO:0x007fd9e5903bb8>, #<UploadIO:0x007fd9e514a3b8 @content_type=\"image/png\", @original_filename=\"indymade-badge-horizontal.png\", @local_path=\"/Users/anthonator/Downloads/indymade-badge-horizontal.png\", @io=#<File:/Users/anthonator/Downloads/indymade-badge-horizontal.png>, @opts={}>, #<StringIO:0x007fd9e5903b90>], @index=0>>, #<Parts::EpiloguePart:0x007fd9e5903ac8 @part=\"-------------RubyMultipartPost--\\r\\n\\r\\n\", @io=#<StringIO:0x007fd9e5903a78>>], @ios=[#<CompositeReadIO:0x007fd9e5903b68 @ios=[#<StringIO:0x007fd9e5903bb8>, #<UploadIO:0x007fd9e514a3b8 @content_type=\"image/png\", @original_filename=\"indymade-badge-horizontal.png\", @local_path=\"/Users/anthonator/Downloads/indymade-badge-horizontal.png\", @io=#<File:/Users/anthonator/Downloads/indymade-badge-horizontal.png>, @opts={}>, #<StringIO:0x007fd9e5903b90>], @index=0>, #<StringIO:0x007fd9e5903a78>], @index=0>, :url=>#<URI::HTTPS:0x007fd9e5909d60 URL:https://myapi>, :request_headers=>{\"User-Agent\"=>\"Faraday v0.8.7\", \"Content-Type\"=>\"multipart/form-data;boundary=-----------RubyMultipartPost\", \"Content-Length\"=>\"8062\"}, :parallel_manager=>nil, :request=>{:proxy=>nil, :boundary=>\"-----------RubyMultipartPost\"}, :ssl=>{}, :response=>#<Faraday::Response:0x007fd9e5903870 ...>}, @on_complete_callbacks=[]>"

正文被设置为CompositeReadIO对象,并且它似乎从未发出过请求。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-01 08:03:01

结果是我需要指定一个适配器。这是最终可以工作的代码。

代码语言:javascript
复制
conn = Faraday.new('http://myapi') do |f|
  f.request :multipart
  f.request :url_encoded
  f.adapter :net_http # This is what ended up making it work
end

payload = { :file => Faraday::UploadIO.new('...', 'image/jpeg') }

conn.post('/', payload)
票数 20
EN

Stack Overflow用户

发布于 2017-11-23 21:22:04

这样的事情解决了我的问题:

代码语言:javascript
复制
conn = Faraday.new(url: URL) do |faraday|
  faraday.request :multipart #make sure this is set before url_encoded
  faraday.request :url_encoded
  faraday.adapter Faraday.default_adapter
end

file = Faraday::UploadIO.new(
  params[:image].tempfile.path,
  params[:image].content_type,
  params[:image].original_filename
)

payload = { :file => file }

conn.post('/', payload)
票数 6
EN

Stack Overflow用户

发布于 2020-01-13 15:24:00

V0.16.0之后的法拉第:https://lostisland.github.io/faraday/middleware/multipart

"Multipart“中间件检测文件并使用”multipart/form-data“进行编码:

代码语言:javascript
复制
payload[:profile_pic] = Faraday::FilePart.new('/path/to/avatar.jpg', 'image/jpeg')

conn.put '/profile', payload
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16725195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档