c# XML-RPCでWordPressにファイルをアップロードする

WordPress に投稿するにあたってもう一つ押さえておきたいのがファイルのアップロード。
記事内で画像を表示させるような使い方は普通にするだろうし。

インターフェイス定義

前回作成したインターフェイス(IWordPress)に wp.uploadFileを追加。

    public interface IWordpress : IXmlRpcProxy
    {
        [XmlRpcMethod("wp.newPost")]
        string newPost(int blog_id, string username, string password, WpContent content);

        [XmlRpcMethod("wp.getTerms")]
        WpTerm[] getTerms(int blog_id, string username, string password, string taxonomy);

        [XmlRpcMethod("wp.uploadFile")]
        WpUploadFileResult uploadFile(int blog_id, string username, string password, WpUploadFileData data);
    }

プログID、ユーザー名、パスワードは今までのメソッドと同じ。
アップロードファイルに関する「引数」および「戻り値」はそれぞれ専用の構造体で定義する。

構造体定義

まず引数として使用されるアップロードファイルのデータを格納する構造体。

    public struct WpUploadFileData
    {
        public string name;     // ファイル名
        public string type;     // MIMEタイプ
        public byte[] bits;     // バイナリデータ
        public bool overwrite;  // 上書き
        public int post_id;     // 関連付ける記事のID?
    }

「name」に設定するのはローカルファイルのパスではなくファイル名。
MIMEタイプは画像であれば次のような感じ。

  • JPEG ⇒ image/jpeg
  • GIF ⇒ image/gif
  • PNG ⇒ image/png

その他の形式もググればすぐに見つかる。

残念ながら「post_id」はよくわからない・・・・

次に戻り値として使用されるアップロードされたファイルのデータを格納する構造体。

    public struct WpUploadFileResult
    {
        public string id;       // ID
        public string file;     // ファイル名
        public string url;      // URL
        public string type;     // MIMEタイプ
    }

「id」はメディアライブラリ内固有の値。
記事内から呼び出す場合は「url」を使用すればOK。

使い方

実際に画像をアップロードするコンソールアプリケーションのソース。

        static void Main(string[] args)
        {
            IWordpress proxy = XmlRpcProxyGen.Create<IWordpress>();
            proxy.Url = "http://HOGE.com/xmlrpc.php";

            WpUploadFileData data = new WpUploadFileData()
            {
                name = "hogehoge.png",
                type = "image/png",
                bits = File.ReadAllBytes(@"c:\hogehoge.png"),
            };

            WpUploadFileResult result = proxy.uploadFile(1, "username", "password", data);

            Console.WriteLine(result.url);
        }

インスタンスの作成とURLの指定は前回と同じ。

6行目から引数を設定して13行目でアップロード。
結果のURLを表示しているのが15行目といった感じ。

まとめ

WordPressのドキュメントを見てみると次のようなコメントが付いているので、バイナリデータはBase64でエンコードしちゃダメらしい。

string bits: binary data. Shouldn’t be base64-encoded.

http://codex.wordpress.org/XML-RPC_WordPress_API/Media#wp.uploadFile

WEBで調べている時に、もともとXMLなのでCDATAセクションとしてどうこうという解説をどこかで見た気がするが、XML-RPC.NETの場合は自動でやってくれるようなので簡単だ。

逆に古いバージョン(?)のAPIだとBase64にする必要があるようだ。
http://codex.wordpress.org/XML-RPC_wp#wp.uploadFile

また、引数の「overwrite」を「true」にするとファイル名が

wpid[数字]-hogehoge.png

になって上書きにはならない。たまに、

wpid-hogehoge[数字].png

になったりもしたが原因は不明w

「overwrite」が「false」だと

hogehoge[数字].png

となり、結局上書きはならなかった・・・何故?

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク