0

Appcelerator Cloud Serviceに接続するC#でアプリケーションを開発しています。これまでのところ、クエリを実行してカスタムオブジェクトを作成できますが、ACSで写真を作成しようとすると問題が発生します。私はこのリンクを見て、次のようにコードを変更しました。

Image img = pbPhoto.Image;
img.Save(Application.StartupPath + "\\tmp.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); //saving the image temporally in hard drive

url = "https://api.cloud.appcelerator.com/v1/photos/create.json?key=appkey&_session_id=" + session;
HttpWebRequest wrGetUrl = (HttpWebRequest)WebRequest.Create(url);

String boundary = "B0unD-Ary";
wrGetUrl.ContentType = "multipart/form-data; boundary=" + boundary;
wrGetUrl.Method = "POST";

String postData = "--" + boundary + "\nContent-Disposition: form-data\n\n";;
postData += "\n--" + boundary + "\nContent-Disposition: form-data; name=\"file\" filename=\"" + Application.StartupPath + "\\tmp.jpg" + "\"\nContent-Type: image/jpeg\n\n";
byteArray = Encoding.UTF8.GetBytes(postData);

byte[] filedata = null;
using (BinaryReader readerr = new BinaryReader(File.OpenRead(Application.StartupPath + "\\tmp.jpg")))
    filedata = readerr.ReadBytes((int)readerr.BaseStream.Length);

wrGetUrl.ContentLength = byteArray.Length + filedata.Length;
wrGetUrl.GetRequestStream().Write(byteArray, 0, byteArray.Length);
wrGetUrl.GetRequestStream().Write(filedata, 0, filedata.Length);

objStream = wrGetUrl.GetResponse().GetResponseStream();
reader = new StreamReader(objStream);

これを試しましたが、次のエラーが発生しました

リモートサーバーがエラーを返しました:(500)内部サーバーエラー。

ACSログを確認しましたが、リクエストが表示されませんでした(500エラーだったためと思われます)。写真をアップロードしてACSで写真を作成するには、コードを何に変更する必要がありますか?あなたが与えるかもしれないどんな助けにも感謝します。

4

1 に答える 1

1

この問題の解決策を見つけました:

byte[] filedata = null;
using (BinaryReader readerr = new BinaryReader(File.OpenRead(pathToImage)))
    filedata = readerr.ReadBytes((int)readerr.BaseStream.Length);
string boundary = "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
Stream stream = request.GetRequestStream();
request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);
StreamWriter writer = new StreamWriter(stream);   
writer.Write("--");
writer.WriteLine(boundary);
writer.WriteLine(@"Content-Disposition: form-data; name=""{0}""; filename=""{1}""", "your_name", "your_photo_file_name");
writer.WriteLine(@"Content-Type: application/octet-stream");
writer.WriteLine(@"Content-Length: " + filedata .Length);
writer.WriteLine();
writer.Flush();
Stream output = writer.BaseStream;
output.Write(filedata , 0, filedata .Length);
output.Flush();
writer.WriteLine();
writer.Write("--");
writer.Write(boundary);
writer.WriteLine("--");
writer.Flush();

編集:ヘッダーを RequestStream に書き込む方法を変更しました。私が書いていた方法は、Appcelerator Cloud Service に画像を送信するのに適切な方法ではありませんでした。curl を介してリクエストを送信し、ACS でログインを確認することで、適切なヘッダーを考えてください。

これが同様の問題を抱えている人に役立つことを願っています。

于 2012-08-30T20:00:08.123 に答える