Ruby on Rails-OAuth 2多部分帖子(上传到Facebook或Soundcloud)

| 我正在使用Rails应用程序,该应用程序使用OmniAuth为我的用户收集Oauth / OAuth2凭据,然后代表他们发布到那些服务中。 创建简单的帖子来更新状态供稿非常有用。现在,我需要上传文件。 Facebook说\“要发布照片,请发出带有文件文件附件的POST请求(multipart / form-data)。” http://developers.facebook.com/docs/reference/api/photo/ 这就是我想要做的: 我在这里实现了模块:Ruby:如何通过HTTP将文件作为multipart / form-data发布?获取标题和数据...
if appearance.post.post_attachment_content_type.to_s.include?(\'image\')

  fbpost = \"https://graph.facebook.com/me/photos\"

  data, headers = Multipart::Post.prepare_query(\"title\" => appearance.post.post_attachment_file_name  , \"document\" => File.read(appearance.post.post_attachment.path))

  paramsarray = {:source=>data, :message=> appearance.post.content}
  response = access_token.request(:post, fbpost, paramsarray, headers)
  appearance.result = response
  appearance.save
end
我但是我收到了OAuth2 :: HTTPError-HTTP 400错误 任何帮助都是难以置信的...正如我所看到的,将文件上传到SoundCloud时也需要此信息。 谢谢, 标记     
已邀请:
自己为此奋斗。 oauth2库由Faraday支持以进行HTTP交互。只需稍作配置,它即可支持开箱即用的上传文件。第一步是在建立连接时添加适当的法拉第中间件。我的代码中的一个示例:
OAuth2::Client.new client_id, secret, site: site do |stack|
  stack.request :multipart
  stack.request :url_encoded
  stack.adapter  Faraday.default_adapter
end
这将多部分编码支持添加到法拉第连接中。接下来,在访问令牌对象上发出请求时,您想使用Faraday :: UploadIO对象。所以:
upload = Faraday::UploadIO.new io, mime_type, filename
access_token.post(\'some/url\', params: {url: \'params\'}, body: {file: upload})
在上面的代码中: io-您要上传的文件的IO对象。可以是File对象,甚至可以是StringIO。 mime_type-您要上传的文件的mime类型。您可以尝试检测此服务器端,或者如果用户将文件上传到您,则应该能够从其请求中提取MIME类型。 文件名-正在调用您要上传的文件。这也可以由您自己选择来确定,也可以使用上传文件的任何用户调用它。 某些/网址-用您要发布到的网址替换 {url:\'params \'}-用您要提供的任何URL参数替换 {file:upload}-用多部分表格数据替换。显然,一个(或多个)键/值对应该具有文件上传的实例。     
我实际上已成功使用此代码在fb页面上上传了照片:
dir = Dir.pwd.concat(\"/public/system/posts/images\")
fb_url = URI.parse(\"https://graph.facebook.com/#{@page_id}/photos\")
img = File.open(\"myfile.jpg\")
req = Net::HTTP::Post::Multipart.new(
  \"#{fb_url.path}?access_token=#{@token}\", 
  \"source\" => UploadIO.new(img, \"application/jpg\", img.path),
  \"message\" => \"some messsage\"
) 
n = Net::HTTP.new(fb_url.host, fb_url.port)
n.use_ssl = true
n.verify_mode = OpenSSL::SSL::VERIFY_NONE
n.start do |http|
  @result = http.request(req)
end
    

要回复问题请先登录注册