C#でLivedoorAPI AtomPubで画像アップロード

投稿者: Anonymous

PHPではできているんですが、C#だとどうしてもできません。画像をアップロードし、返ってきたHTMLコードを取得したいです。
コンパイル通ります。

        XmlDocument xdoc = new XmlDocument();
        var xdeclaration = xdoc.CreateXmlDeclaration("1.0", "utf-8", null);
        xdoc.AppendChild(xdeclaration);
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create
                ("http://rootend");

        // ローカル,今だけ画像URL
        string img = "http://c.jpg";
        System.Net.ServicePointManager.Expect100Continue = false;
        req.Method = "POST";
        req.Headers.Add("X-WSSE", wsseHeader());
        req.ContentType = "image/jpeg";
        req.GetResponse();

        Stream stream = req.GetRequestStream();

        //Console.WriteLine(xdoc.ToStringXml());
        Console.WriteLine("habe = " + req.HaveResponse);
        Console.WriteLine(req);

PHPではこうなります。

require_once 'HTTP/Request2.php';
$pwd = 'API_KEY';
$id = 'LIVE_ID';
$url1= 'https://livedoor.blogcms.jp/atompub/hogehoge';
$imgfiles = array(
                 "http://a.jpg",
                 "http://b.jpg");

foreach($imgfiles as $imgfile) {
    $imgdata = file_get_contents($imgfile);
    $content_type = image_type_to_mime_type(exif_imagetype($imgfile));

    try{
         $req = new HTTP_Request2();
         $req->setUrl($url1);
         $req->setConfig(array('ssl_verify_host' => false,
                               'ssl_verify_peer' => false
                               ));
         $req->setHeader("Content-Type", $content_type);
         $req->setHeader('Expect', '');
         $req->setMethod(HTTP_Request2::METHOD_POST);
         $req->setAuth($id, $pwd);
         $req->setBody($imgdata);

         $response = $req->send();
         $xml = simplexml_load_string($response->getBody());
        $src = $xml->content['src'];
        var_dump($response);

参考にしたサイト
http://nekoriki.net/57

LivedoorAPI公式
http://help.blogpark.jp/archives/52372407.html

解決

GetRequestStream() で書き込み用ストリームを取得して CopyTo で書きこんで下さい。

using(Stream dataStream = request.GetRequestStream ())
{
    using(FileStream fs = new FileStream(img, FileMode.Open, FileAccess.Read))
    {
        fs.CopyTo(dataStream);
    }
}

コードは試してないのでお気を付けて。もっと簡単にやるのならば、WebClient を使った方がいいと思います。UploadData という関数1コールで実現出来ます。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *