【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を指定して取得
- 対象画像をクリップボードの画像から取得
たまに大きすぎる画像をアップしたい場合などは、別のアプリケーションを使ってリサイズしてからアップロードしてましたので、一括で行えるのはかなり便利です。
今のところ特に公開するつもりは無かったので自分用として汎用的には作っていませんが、もし使いたいと言う声が何件かあれば、ある程度汎用的にして公開も考えたいと思います!