如何使用HTTP POST multipartform-data将文件上传到服务器?

如何使用HTTP POST multipartform-data将文件上传到服务器?,第1张

如何使用HTTP POST multipart / form-data将文件上传到服务器?

这是我最后的工作代码。我的Web服务需要一个文件(POST参数称为“ file”)和一个字符串值(POST参数名称为“ userid”)。

/// <summary>/// Occurs when upload backup application bar button is clicked. Author : Farhan Ghumra /// </summary>private async void btnUploadBackup_Click(object sender, EventArgs e){    var dbFile = await ApplicationData.Current.LocalFolder.GetFileAsync(Util.DBNAME);    var fileBytes = await GetBytesAsync(dbFile);    var Params = new Dictionary<string, string> { { "userid", "9" } };    UploadFilesToServer(new Uri(Util.UPLOAD_BACKUP), Params, Path.GetFileName(dbFile.Path), "application/octet-stream", fileBytes);}/// <summary>/// Creates HTTP POST request & uploads database to server. Author : Farhan Ghumra/// </summary>private void UploadFilesToServer(Uri uri, Dictionary<string, string> data, string fileName, string fileContentType, byte[] fileData){    string boundary = "----------" + DateTime.Now.Ticks.ToString("x");    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);    httpWebRequest.ContentType = "multipart/form-data; boundary=" + boundary;    httpWebRequest.Method = "POST";    httpWebRequest.BeginGetRequestStream((result) =>    {        try        { HttpWebRequest request = (HttpWebRequest)result.AsyncState; using (Stream requestStream = request.EndGetRequestStream(result)) {     WriteMultipartForm(requestStream, boundary, data, fileName, fileContentType, fileData); } request.BeginGetResponse(a => {     try     {         var response = request.EndGetResponse(a);         var responseStream = response.GetResponseStream();         using (var sr = new StreamReader(responseStream))         {  using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))  {      string responseString = streamReader.ReadToEnd();      //responseString is depend upon your web service.      if (responseString == "Success")      {          MessageBox.Show("Backup stored successfully on server.");      }      else      {          MessageBox.Show("Error occurred while uploading backup on server.");      }   }         }     }     catch (Exception)     {     } }, null);        }        catch (Exception)        {        }    }, httpWebRequest);}/// <summary>/// Writes multi part HTTP POST request. Author : Farhan Ghumra/// </summary>private void WriteMultipartForm(Stream s, string boundary, Dictionary<string, string> data, string fileName, string fileContentType, byte[] fileData){    /// The first boundary    byte[] boundarybytes = Encoding.UTF8.GetBytes("--" + boundary + "rn");    /// the last boundary.    byte[] trailer = Encoding.UTF8.GetBytes("rn--" + boundary + "--rn");    /// the form data, properly formatted    string formdataTemplate = "Content-Dis-data; name="{0}"rnrn{1}";    /// the form-data file upload, properly formatted    string fileheaderTemplate = "Content-Dis-data; name="{0}"; filename="{1}";rnContent-Type: {2}rnrn";    /// Added to track if we need a CRLF or not.    bool bNeedsCRLF = false;    if (data != null)    {        foreach (string key in data.Keys)        { /// if we need to drop a CRLF, do that. if (bNeedsCRLF)     WriteToStream(s, "rn"); /// Write the boundary. WriteToStream(s, boundarybytes); /// Write the key. WriteToStream(s, string.Format(formdataTemplate, key, data[key])); bNeedsCRLF = true;        }    }    /// If we don't have keys, we don't need a crlf.    if (bNeedsCRLF)        WriteToStream(s, "rn");    WriteToStream(s, boundarybytes);    WriteToStream(s, string.Format(fileheaderTemplate, "file", fileName, fileContentType));    /// Write the file data to the stream.    WriteToStream(s, fileData);    WriteToStream(s, trailer);}/// <summary>/// Writes string to stream. Author : Farhan Ghumra/// </summary>private void WriteToStream(Stream s, string txt){    byte[] bytes = Encoding.UTF8.GetBytes(txt);    s.Write(bytes, 0, bytes.Length);}/// <summary>/// Writes byte array to stream. Author : Farhan Ghumra/// </summary>private void WriteToStream(Stream s, byte[] bytes){    s.Write(bytes, 0, bytes.Length);}/// <summary>/// Returns byte array from StorageFile. Author : Farhan Ghumra/// </summary>private async Task<byte[]> GetBytesAsync(StorageFile file){    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);        }    }    return fileBytes;}

我非常感谢达琳·卢梭(Darin
Rousseau)
的帮助。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5487557.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存