読者です 読者をやめる 読者になる 読者になる

あらかじめ日記

2chまとめサイト「ソノウソホント?」の雑記と、ブログで使えるスクリプトとかテクニックとか。その他、音楽やアニメ、漫画の話題とかも。

まとめサイト「ソノウソホント?」と「ムードもりあげ楽団」はこちら。

【C#/XML-RPC】ブログに画像のファイル名を自動生成してアップロードするツールを作成してみた(ついでに画像のリサイズも) 続き

前回からの続きで、今回はアップロードになりますが、基本は前回と同じです。

API名は、「metaWeblog.newMediaObject

リクエスト情報は、
 ID、ユーザ名、パスワード、Base64エンコードされたバイナリデータ、ファイル名

ここでのポイントはバイナリデータでしょうか。

 
ファイルのバイナリデータを文字列化し、さらにそれをBase64エンコードに変換して渡します。

C#での(画像ファイルの場合の)サンプルは以下になります。

  // bmpDataはアップロード対象のBitmapオブジェクト

  byte[] imgBytes;
  using (System.IO.MemoryStream memStm = new System.IO.MemoryStream ()) {

    // 保存フォーマットは任意
    bmpData.Save (memStm, System.Drawing.Imaging.ImageFormat.Jpeg);

    imgBytes = memStm.ToArray ();

    memStm.Close ();
  }
  string base64Str = Convert.ToBase64String (imgBytes);

バイト配列にした後、変換メソッドBase64の文字列化をしています。

後はこれをXML形式にして渡すだけになりますが、要注意するところはバイナリデータとファイル名はstructでまとめて渡します

サンプルとして記載すると以下の様になります。

string reqStr = "<?xml version=\"1.0\"?>";

reqStr += "<methodCall>";
reqStr += "<methodName>blogger.getUsersBlogs</methodName>";
reqStr += "<params>";
reqStr += "<param><value><string>" + アプリケーションキー  + "</string></value></param>";
reqStr += "<param><value><string>" + ユーザID + "</string></value></param>";
reqStr += "<param><value><string>" + パスワード + "</string></value></param>";
reqStr += "<param><value><struct>";
reqStr += "<member><name>bits</name>";
reqStr += "<value><base64>" + バイナリデータ + "</base64></value>";
reqStr += "</member>";
reqStr += "<member><name>name</name>";
reqStr += "<value><string>" + ファイル名 + "</string></value>";
reqStr += "</member>";
reqStr += "</struct></value></param>";
reqStr += "</params>";
reqStr += "</methodCall>";

レスポンス結果は
 アップロードファイルURL、サムネイルURL(あれば)

FC2では、ある程度画像サイズが大きい場合(おそらく縦or横が300px以上)はサムネイルが作成され、サムネイル用のURLも併せて返ります。
(もしかするとサムネイル作成するかどうかはブログ側の設定で変わるかもしれません。。)

※また、この辺りの仕様はブログによって変わる可能性がありますのでご注意ください。

前回同様、struct以下がこのような感じで返ります。
(FC2ですと、サムネイル画像が作成されない場合は「thumbnail_url」側の「member」タグがない状態で返ってきます)

      <member><name>url</name><value><string>http://xxx.xxx</string></value></member>
      <member><name>thumbnail_url</name><value><string>http://xxx.xxx</string></value></member>


以上で、アップロードまで行えることができました!


ちなみに現在作成したものは勢いで色々と機能を付け足して、ファイル名の自動設定、ブログへのアップロードの他に、以下も出来るようにしています。

  • 対象画像のリサイズ
  • 矩形選択して対象画像を切り抜き
  • 対象画像をインターネット上のURLを指定して取得
  • 対象画像をクリップボードの画像から取得


たまに大きすぎる画像をアップしたい場合などは、別のアプリケーションを使ってリサイズしてからアップロードしてましたので、一括で行えるのはかなり便利です

今のところ特に公開するつもりは無かったので自分用として汎用的には作っていませんが、もし使いたいと言う声が何件かあれば、ある程度汎用的にして公開も考えたいと思います!