HTTP POST Multipart/Form-Data を使用して Windows Phone 8 のサーバーにファイルを正しくアップロードします
Web 開発では、multipart/form-data を指定した HTTP POST を使用してサーバーにファイルをアップロードするのが一般的なタスクです。この記事では、HTTPWebRequest を使用して Windows Phone 8 アプリにファイルをアップロードするときに発生する問題を解決し、改善されたソリューションを提供します。
Windows Phone 8 の元のコード
元の実装では、HttpWebRequest を使用してマルチパート/フォームデータの POST リクエストを送信します。ただし、このコードは、メタデータを伴わないファイル全体を誤って送信しようとします。マルチパート/フォームデータリクエストでは、ファイル境界と必要なフォームデータヘッダーを指定する必要があります。
Windows Phone 8 向けの改善されたソリューション
この問題を解決するために、次のコードを変更します:
<code class="language-csharp">async void MainPage_Loaded(object sender, RoutedEventArgs e) { var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(DBNAME); byte[] fileBytes = null; using (var stream = await file.OpenReadAsync()) { fileBytes = new byte[stream.Size]; using (var reader = new DataReader(stream)) { await reader.LoadAsync((uint)stream.Size); reader.ReadBytes(fileBytes); } } string boundary = Guid.NewGuid().ToString(); HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.myserver.com/upload.php"); httpWebRequest.ContentType = "multipart/form-data; boundary=" + boundary; httpWebRequest.Method = "POST"; httpWebRequest.BeginGetRequestStream(GetRequestStreamCallback, new object[] { fileBytes, boundary }); } private void GetRequestStreamCallback(IAsyncResult asynchronousResult, object state) { object[] stateData = (object[])state; byte[] postData = (byte[])stateData[0]; string boundary = (string)stateData[1]; HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; Stream postStream = request.EndGetRequestStream(asynchronousResult); //写入起始边界 byte[] boundaryBytes = System.Text.Encoding.UTF8.GetBytes("--" + boundary + "\r\n"); postStream.Write(boundaryBytes, 0, boundaryBytes.Length); //写入文件数据 string filename = DBNAME; byte[] fileData = System.Text.Encoding.UTF8.GetBytes($"Content-Disposition: form-data; name=\"file\"; filename=\"{filename}\"\r\nContent-Type: application/octet-stream\r\n\r\n"); postStream.Write(fileData, 0, fileData.Length); postStream.Write(postData, 0, postData.Length); //写入结束边界 boundaryBytes = System.Text.Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n"); postStream.Write(boundaryBytes, 0, boundaryBytes.Length); postStream.Close(); request.BeginGetResponse(GetResponseCallback, request); } private void GetResponseCallback(IAsyncResult asynchronousResult) { HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult)) using (Stream streamResponse = response.GetResponseStream()) using (StreamReader streamRead = new StreamReader(streamResponse)) { string responseString = streamRead.ReadToEnd(); // 处理服务器响应 } }</code>
結論
この変更されたコードにより、Windows Phone 8 アプリでのファイルのアップロードの問題が解決されます。マルチパート/フォームデータリクエストを使用する場合は、必ず境界を正しく指定し、ファイルと付随するメタデータに必要なヘッダーを提供するようにしてください。 より明確な Content-Disposition ヘッダーがコードに追加され、リソースの正しい解放を保証するために using ステートメントが使用されます。
以上がWindows Phone 8 で HTTP POST Multipart/Form-Data を使用してファイルをサーバーに正しくアップロードする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。