フォト蔵へアップロードするとエラー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();
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
/*
役に立たない雑多なメモ:
*一応俺の環境では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());
}
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 『G19 Gen5 MOS - Modular Optic System for Gen5』 の 『 1 2023/03/05 13:37
- 英語 Modular Optic System (MOS)とは、一体どの様な物の事なのかを教えてください。 1 2023/03/03 09:52
- 英語 下記の英文を日本語に訳して、その意味を教えてください。 1 2023/03/09 14:13
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Gmail 【お助け!】サーバーからのメール送信でGmailに送信されない問題について 1 2023/06/20 22:03
- 英語 下記の英文の日本語訳をお願いします。 1 2023/03/02 10:01
- C言語・C++・C# PC画面を録画するプログラムでdllの読み込みエラー 1 2023/04/22 08:31
- OCN光 「メールが届きませんでした」という大量のメール 4 2023/02/08 20:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelのマクロでワードのテキス...
-
配列でデータが入っている要素...
-
ブレーカー落ちで壊れたりしな...
-
合計3TBのデータのハッシュ値を...
-
fortranでの並び替えについて
-
教えて下さい
-
vba ドロップダウンリストの図...
-
曲線グラフからピーク値を求め...
-
VBA & easycomm で長時間測定の...
-
javaでDBからデータを取ってき...
-
VBA 空白セルを削除ではない方...
-
EXCEL2000 区切り位置指定ウィ...
-
VBAを使ってOutlookメール本文...
-
VBA 該当データがない時 ...
-
エクセルVBAでもっと早く転記
-
秒間の最大値を求めたい
-
2つのマクロでチェックボックス...
-
特定のPCだけ動作しないVBAマク...
-
エクセルのマクロについて教え...
-
Excel・Word リサーチ機能を無...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
配列でデータが入っている要素...
-
多量のSUMIF式を軽くしたい
-
エクセルで2つの時系列のデー...
-
Excelのマクロでワードのテキス...
-
メモ帳(テキストデータ)をExc...
-
VBA 空白セルを削除ではない方...
-
VBAを使ってOutlookメール本文...
-
Accessで該当データにフラグを...
-
合計3TBのデータのハッシュ値を...
-
シーケンサにパソコンからアク...
-
S9タイプからXタイプにデータ...
-
カンマからスラッシュに
-
VBAでシートからコンボボックス...
-
VBA 毎日取得するデータを順番...
-
ビットシフトについて
-
ユーザーフォームのテキストボ...
-
EXCELVBAでSQLserverからデータ...
-
特定のデータの抽出方法を教え...
おすすめ情報