- 締切済み
フォト蔵へアップロードできません(C#)
フォト蔵へアップロードするとエラー400が出てしまいます。 何が原因なのでしょうか?原因を教えてください。 以下コード //フォト蔵へのアップロード(注意動きません)// //送信するファイルのパス filePath="C:\\Users\\Public\\Pictures\\Sample Pictures\\test.jpg"; //送信先のURL string url1 = "http://api.photozou.jp/rest/photo_add"; //文字コード System.Text.Encoding enc = System.Text.Encoding.GetEncoding("UTF-8"); //WebRequestの作成 System.Net.HttpWebRequest req = (System.Net.HttpWebRequest) System.Net.WebRequest.Create(url1); //メソッドにPOSTを指定 req.Method = "POST"; //ベーシック認証宣言、アカウントとパスワード req.PreAuthenticate = true; NetworkCredential network = new NetworkCredential("mailaddress@hoge.com", "password"); req.Credentials = network; //ヘッダを設定 req.Headers.Add("album_id", "1234567"); //ContentTypeを設定 req.ContentType = "image/jpeg"; //POST送信するデータを作成 System.IO.FileStream fs = new System.IO.FileStream( filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read); //POST送信するデータの長さを指定 req.ContentLength = fs.Length; //データをPOST送信するためのStreamを取得 System.IO.Stream reqStream = req.GetRequestStream(); //ファイルの内容を送信 byte[] readData = new byte[0x1000]; int readSize = 0; while (true) { readSize = fs.Read(readData, 0, readData.Length); if (readSize == 0) break; reqStream.Write(readData, 0, readSize); } fs.Close(); reqStream.Close(); //サーバーからの応答を受信するためのWebResponseを取得 System.Net.HttpWebResponse res = (System.Net.HttpWebResponse) req.GetResponse(); //応答データを受信するためのStreamを取得 System.IO.Stream resStream = res.GetResponseStream(); //受信 System.IO.StreamReader sr = new System.IO.StreamReader(resStream, enc); //閉じる sr.Close();
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- himajin100000
- ベストアンサー率54% (1660/3060)
/* 役に立たない雑多なメモ: *一応俺の環境ではmultipart/form-dataを使用することで、できるようになった。 ドキュメントの記述内容から推測したけど、正直チュートリアル的なしっかりサンプルを出してほしい… * ユーザー名・パスワード・ローカルマシン上の画像ファイルの位置・画像ファイルの形式・album_idの値・MIMEの画像のContent-Dispositionのfilenameパラメータに与えるファイル名(なんか付けないと400が返ってきた)は適宜置き換えてください。 ** album_idは (特定のアルバムを見たときのURIが http://photozou.jp/photo/list/1234567/4321098 みたいになっている。最後の4321098でわかる。) * Flushを埋め込む必要があるかどうかは知らないですが、一応念のため。意味ないかも。 * MIMEのRFCを読んだわけじゃないので最後 --AAAAA--というふうな形式にしなければならないかは調べていません。 * 画像データ中に"--AAAAA"と同じバイト列が含まれるとそれがboundary(デリミタ)とみなされたりすることあるんだろうか? *ユーザー認証に失敗したときは401が返ってきた。 *最初WireSharkで参考にしようと思ってオフィシャルアプリの「貼る蔵3」をインストールするも、フォト蔵のFAQにあるようにWindows Firewallに阻まれてアクセス出来なくて嵌ってた。いちおうファイアーウォール側では未知のアプリは通知するようチェックを入れているつもりなのだが通知、特になかったような。うーむ。 *質問文でFileStream.Readで提示されている、「提供できるわけじゃないんで分からないんで、指定したデータ長よりも短いデータしか読み込まれないかもしれない」ケースは俺の環境では怒らなかったので調査はしてない。心配なら質問文の通りにコードを書いてもいいと思う。ネットワークなんかじゃ、全データがちょっとずつしかこないことは起こりやすいんだろうけど。 */ using System; using System.IO; using System.Net; namespace TEST5 { class MainClass { public static void Main (string[] args) { String boundary = "AAAAA"; System.Uri uri = new System.Uri("http://api.photozou.jp/rest/photo_add"); System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(uri); req.Method = "POST"; req.KeepAlive = true; req.PreAuthenticate = true; NetworkCredential network = new NetworkCredential("himajin10****@gmail.com", "example"); req.Credentials = network; // ====================================== req.ContentType = "multipart/form-data;boundary=" + boundary; Stream s = req.GetRequestStream(); StreamWriter sw = new StreamWriter(s,System.Text.Encoding.ASCII); sw.NewLine = "\r\n"; sw.WriteLine("--" + boundary); // =============================================== sw.WriteLine("Content-Disposition:form-data;name=\"photo\";filename=\"ccd.png\""); sw.WriteLine("Content-Type:image/png"); sw.WriteLine("Content-Transfer-Encoding: binary"); sw.WriteLine(); sw.Flush(); FileStream fs = new FileStream("D:\\test\\aaa.png",System.IO.FileMode.Open); byte[] bytearray = new byte[fs.Length]; fs.Read(bytearray,0,Convert.ToInt32(fs.Length)); fs.Close(); s.Write(bytearray,0,bytearray.Length); s.Flush(); sw.WriteLine(); sw.Flush(); sw.WriteLine("--" + boundary); sw.Flush(); // ================================================= sw.WriteLine("Content-Disposition:form-data;name=\"album_id\""); sw.WriteLine(); sw.WriteLine("4235010"); sw.Flush(); // =================================================== sw.Write("--" + boundary + "--"); sw.Close(); s.Close(); System.IO.StreamReader sr = new System.IO.StreamReader(req.GetResponse().GetResponseStream(), System.Text.Encoding.UTF8); System.Console.WriteLine(sr.ReadToEnd()); } } }