Dateien mit HTTP POST Multipart/Form-Data korrekt auf den Server in Windows Phone 8 hochladen
In der Webentwicklung ist das Hochladen von Dateien auf den Server mithilfe von HTTP POST mit Multipart-/Formulardaten eine häufige Aufgabe. In diesem Artikel werden Probleme behoben, die bei der Verwendung von HTTPWebRequest zum Hochladen von Dateien in Windows Phone 8-Apps auftreten, und eine verbesserte Lösung bereitgestellt.
Originalcode in Windows Phone 8
Die ursprüngliche Implementierung verwendet HttpWebRequest, um mehrteilige/Formulardaten-POST-Anfragen zu senden. Der Code versucht jedoch fälschlicherweise, die gesamte Datei ohne zugehörige Metadaten zu senden. Bei mehrteiligen/Formulardatenanforderungen müssen Dateigrenzen und die erforderlichen Formulardatenheader angegeben werden.
Verbesserte Lösungen für Windows Phone 8
Um dieses Problem zu lösen, ist der folgende geänderte Code:
<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>
Fazit
Dieser geänderte Code sollte Probleme beim Hochladen von Dateien in Windows Phone 8-Apps beheben. Denken Sie daran, bei der Verwendung von Multipart-/Formulardatenanfragen darauf zu achten, die Grenzen korrekt anzugeben und die erforderlichen Header für die Datei und die zugehörigen Metadaten bereitzustellen. Dem Code wurde ein klarerer Content-Disposition-Header hinzugefügt, und es werden Using-Anweisungen verwendet, um die korrekte Freigabe von Ressourcen sicherzustellen.
Das obige ist der detaillierte Inhalt vonWie lade ich Dateien mit HTTP POST Multipart/Form-Data in Windows Phone 8 korrekt auf einen Server hoch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!