Télécharger correctement les fichiers sur le serveur dans Windows Phone 8 à l'aide de HTTP POST Multipart/Form-Data
Dans le développement Web, le téléchargement de fichiers sur le serveur à l'aide de HTTP POST avec multipart/form-data est une tâche courante. Cet article résoudra les problèmes rencontrés lors de l'utilisation de HTTPWebRequest pour télécharger des fichiers dans les applications Windows Phone 8 et fournira une solution améliorée.
Code original dans Windows Phone 8
L'implémentation d'origine utilise HttpWebRequest pour envoyer des requêtes POST multipart/form-data. Cependant, le code tente à tort d’envoyer l’intégralité du fichier sans les métadonnées associées. Les requêtes multipart/form-data doivent spécifier les limites des fichiers et les en-têtes de données de formulaire nécessaires.
Solutions améliorées pour Windows Phone 8
Pour résoudre ce problème, voici le code modifié :
<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>
Conclusion
Ce code modifié devrait résoudre les problèmes de téléchargement de fichiers dans les applications Windows Phone 8. N'oubliez pas que lorsque vous utilisez des requêtes multipart/form-data, veillez à spécifier correctement les limites et à fournir les en-têtes nécessaires pour le fichier et les métadonnées qui l'accompagnent. Un en-tête Content-Disposition plus clair a été ajouté au code et des instructions using sont utilisées pour garantir la libération correcte des ressources.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!