Rails: Как опубликовать файл через HTTP как multipart / form-data в Facebook? - PullRequest
3 голосов
/ 19 августа 2011

Я хотел бы опубликовать новую фотографию для пользователя, используя Net::HTTP::multipart из приложения Heroku в Facebook.

У меня есть следующий объект JSON:

{"message"=>"My message", "image"=>#<ActionDispatch::Http::UploadedFile:0x00000004242490 @original_filename="neEZYMAnBI.jpg", @content_type="application/octet-stream", @headers="Content-Disposition: form-data; name=\"image\"; filename=\"/home/user/public/direct/fb_images/neEZYMAnBI.jpg\"\r\nContent-Type: application/octet-stream\r\n", @tempfile=#<File:/app/tmp/RackMultipart20110818-1-18qnwtj>>, "method"=>"post", "access_token"=>"my_access_token", "format"=>"json"}

Я пытался использовать:

require 'net/http/post/multipart'

url = URI.parse('https://graph.facebook.com/me/photos?access_token=#{params[:access_token]}')
File.open(params[@tempfile]) do |jpg|
  req = Net::HTTP::Post::Multipart.new url.path,
    "file" => UploadIO.new(jpg, "image/jpeg", "image.jpg")
  res = Net::HTTP.start(url.host, url.port) do |http|
    http.request(req)
  end
end

Но:

  1. Данные не отправляются.
  2. Я не могу найти, как отправить params [: message] с файлом, чтобы иметь подпись к изображению.

Может кто-нибудь предложить решение?

Спасибо

Ответы [ 2 ]

1 голос
/ 19 августа 2011

У вас уже есть доступ к File экземпляру (ну, TempFile экземпляру) с params[:image].tempfile

Уничтожьте все вещи File.open и просто создайте UploadIO с этим:

UploadIO.new(params[:image].tempfile, ...)
0 голосов
/ 15 декабря 2016

Как отправить params [: message] вместе с файлом, чтобы иметь подпись к изображению?

В Rails 4 размещать файлы с другими обычными параметрами, такими как inputзначения должны работать как показано ниже

def model_params
  require_params = params.require(:model).permit(:param_one, :param_two, :param_three, :avatar)
  require_params[:avatar] = model_params[:avatar].present? ? UploadIO.new(model_params[:avatar].tempfile,  model_params[:avatar].content_type, model_params[:avatar].original_filename) : nil
  require_params
end

require 'net/http/post/multipart'

url = URI.parse('http://www.example.com/upload')
Net::HTTP.start(url.host, url.port) do |http|
  req = Net::HTTP::Post::Multipart.new(url, model_params)
  key = "authorization_key"
  req.add_field("Authorization", key)
  http.use_ssl = (url.scheme == "https")
  http.request(req)
end

В вашем случае просто

req = Net::HTTP::Post::Multipart.new(url.path, 
      { 
        "file" => UploadIO.new(params[:image].tempfile,  
                               params[:image].content_type,
                               params[:image].original_filename),
        "message" => params[:message]
      })

проще:

params[:image] = UploadIO.new(params[:image].tempfile,  
                              params[:image].content_type,
                              params[:image].original_filename)
req = Net::HTTP::Post::Multipart.new(url.path, params)

https://github.com/Feuda/multipart-post/tree/patch-1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...