如何通过 HttpWebRequest 上传文件?
生活随笔
收集整理的這篇文章主要介紹了
如何通过 HttpWebRequest 上传文件?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
咨詢區
dr. evil
我不希望通過 WebDAV 文件夾的方式上傳文件,我想通過相關的 HttpWebRequest 類,類庫或者代碼片段來幫我模擬瀏覽器行為來上傳文件,請問是否有好的解決方案?
回答區
Joshcodes
如果你用的是基于 .NET 4.5 以上的版本,直接從 NuGet 上引用 Microsoft.Net.Http 工具包即可,不需要任何擴展代碼,外部代碼或者 HTTP 低級別的代碼,參考如下例子:
private?async?Task<System.IO.Stream>?UploadAsync(string?url,?string?filename,?Stream?fileStream,?byte?[]?fileBytes) {//?Convert?each?of?the?three?inputs?into?HttpContent?objectsHttpContent?stringContent?=?new?StringContent(filename);//?examples?of?converting?both?Stream?and?byte?[]?to?HttpContent?objects//?representing?input?type?fileHttpContent?fileStreamContent?=?new?StreamContent(fileStream);HttpContent?bytesContent?=?new?ByteArrayContent(fileBytes);//?Submit?the?form?using?HttpClient?and?//?create?form?data?as?Multipart?(enctype="multipart/form-data")using?(var?client?=?new?HttpClient())using?(var?formData?=?new?MultipartFormDataContent())?{//?Add?the?HttpContent?objects?to?the?form?data//?<input?type="text"?name="filename"?/>formData.Add(stringContent,?"filename",?"filename");//?<input?type="file"?name="file1"?/>formData.Add(fileStreamContent,?"file1",?"file1");//?<input?type="file"?name="file2"?/>formData.Add(bytesContent,?"file2",?"file2");//?Invoke?the?request?to?the?server//?equivalent?to?pressing?the?submit?button?on//?a?form?with?attributes?(action="{url}"?method="post")var?response?=?await?client.PostAsync(url,?formData);//?ensure?the?request?was?a?successif?(!response.IsSuccessStatusCode){return?null;}return?await?response.Content.ReadAsStreamAsync();} }Stefan
關于文件上傳,除了單文件,我的類庫中還支持多文件上傳,無本地文件的流上傳,參考下面代碼:
public?class?FormFile? {public?string?Name?{?get;?set;?}public?string?ContentType?{?get;?set;?}public?string?FilePath?{?get;?set;?}public?Stream?Stream?{?get;?set;?} }public?class?RequestHelper {public?static?string?PostMultipart(string?url,?Dictionary<string,?object>?parameters)?{string?boundary?=?"---------------------------"?+?DateTime.Now.Ticks.ToString("x");byte[]?boundaryBytes?=?System.Text.Encoding.ASCII.GetBytes("\r\n--"?+?boundary?+?"\r\n");HttpWebRequest?request?=?(HttpWebRequest)WebRequest.Create(url);request.ContentType?=?"multipart/form-data;?boundary="?+?boundary;request.Method?=?"POST";request.KeepAlive?=?true;request.Credentials?=?System.Net.CredentialCache.DefaultCredentials;if(parameters?!=?null?&&?parameters.Count?>?0)?{using(Stream?requestStream?=?request.GetRequestStream())?{foreach(KeyValuePair<string,?object>?pair?in?parameters)?{requestStream.Write(boundaryBytes,?0,?boundaryBytes.Length);if(pair.Value?is?FormFile)?{FormFile?file?=?pair.Value?as?FormFile;string?header?=?"Content-Disposition:?form-data;?name=\""?+?pair.Key?+?"\";?filename=\""?+?file.Name?+?"\"\r\nContent-Type:?"?+?file.ContentType?+?"\r\n\r\n";byte[]?bytes?=?System.Text.Encoding.UTF8.GetBytes(header);requestStream.Write(bytes,?0,?bytes.Length);byte[]?buffer?=?new?byte[32768];int?bytesRead;if(file.Stream?==?null)?{//?upload?from?fileusing(FileStream?fileStream?=?File.OpenRead(file.FilePath))?{while((bytesRead?=?fileStream.Read(buffer,?0,?buffer.Length))?!=?0)requestStream.Write(buffer,?0,?bytesRead);fileStream.Close();}}else?{//?upload?from?given?streamwhile((bytesRead?=?file.Stream.Read(buffer,?0,?buffer.Length))?!=?0)requestStream.Write(buffer,?0,?bytesRead);}}else?{string?data?=?"Content-Disposition:?form-data;?name=\""?+?pair.Key?+?"\"\r\n\r\n"?+?pair.Value;byte[]?bytes?=?System.Text.Encoding.UTF8.GetBytes(data);requestStream.Write(bytes,?0,?bytes.Length);}}byte[]?trailer?=?System.Text.Encoding.ASCII.GetBytes("\r\n--"?+?boundary?+?"--\r\n");requestStream.Write(trailer,?0,?trailer.Length);requestStream.Close();}}using(WebResponse?response?=?request.GetResponse())?{using(Stream?responseStream?=?response.GetResponseStream())using(StreamReader?reader?=?new?StreamReader(responseStream))return?reader.ReadToEnd();}} }然后像下面這樣使用。
RequestHelper.PostMultipart("http://www.myserver.com/upload.php",?new?Dictionary<string,?object>()?{{?"testparam",?"my?value"?},{?"file",?new?FormFile()?{?Name?=?"image.jpg",?ContentType?=?"image/jpeg",?FilePath?=?"c:\\temp\\myniceimage.jpg"?}?},{?"other_file",?new?FormFile()?{?Name?=?"image2.jpg",?ContentType?=?"image/jpeg",?Stream?=?imageDataStream?}?},});點評區
這是一個老問題了,不過談靈活莫過于 HttpWebRequest。
總結
以上是生活随笔為你收集整理的如何通过 HttpWebRequest 上传文件?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新年伊始 .Net7 preview1
- 下一篇: C#中的语句