ホームページ >バックエンド開発 >C++ >Windows Phone 8 で HTTP POST Multipart/Form-Data を使用してファイルをサーバーに正しくアップロードする方法

Windows Phone 8 で HTTP POST Multipart/Form-Data を使用してファイルをサーバーに正しくアップロードする方法

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-21 04:12:09239ブラウズ

How to Correctly Upload Files to a Server using HTTP POST Multipart/Form-Data in Windows Phone 8?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。