最新 / RSS

A More Beautiful day

Wassr に画像付き POST

画像データ付きで POST する場合は "multipart/form-data" で送る必要があるようで。ただ、画像データ付きじゃないときでも "multipart/form-data" で POST することはできます。

Net::HTTP::Post で multipart 形式は送れなさそうなので、multipart 送信は自前で作った。

POST する画像データ部分には、値は適当でいいので、"filename=" を指定する必要があります。

これが分からずはまってました。

#!/usr/bin/ruby

require "rubygems"
require "pit"

require "WebService"
require "uri"

module WebService
  class Simple
    def upload(request_uri, params = {})
      p = @params.merge(params)
      boundary = make_boundary

      Net::HTTP.start(@base_url.host, @base_url.port) do |http|
        req = Net::HTTP::Post.new(@base_url.request_uri + request_uri)
        req["user-agent"] = @user_agent  unless @user_agent.empty?
        req["content-type"] = "multipart/form-data; boundary=#{boundary}"

        req.basic_auth(@username, @password)  if @username && @password

        req.body = make_multipart(boundary, p)

        res = http.request(req)

        res.body.toutf8
      end
    end

    def make_boundary(size = 32)
      Array.new(size).map{(0x61 + rand(26)).chr}.join
    end

    # ref. Wasaco http://coderepos.org/share/browser/platform/air/wasaco/src/vc/kan/net
    def make_multipart(boundary, params)
      s = ""
      params.each_pair do |key, val|
        s << "--#{boundary}\r\n"
        if key == :image
          s << "Content-Disposition: form-data; name=\"#{key}\"; filename=\"img.jpg\"\r\n"
          s << "Content-Type: image/jpg\r\n"
        else
          s << "Content-Disposition: form-data; name=\"#{key}\";\r\n"
        end
        s << "\r\n"
        s << "#{val}"
        s << "\r\n"
      end
      s << "--#{boundary}--"
      s
    end
  end
end

pit = Pit.get("wassr")

wassr = WebService::Simple.new
wassr.basic_auth(pit["username"], pit["password"])
wassr.base_url 'http://api.wassr.jp/statuses/'

bin = File.open("text_draw.jpg", "rb").read

wassr.upload('update.json', {:source => 'WebService::Simple(Ruby)', :status => "てすと", :image => bin})