如何通过 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 上传文件?相关推荐
- C# 使用HttpWebRequest通过PHP接口 上传文件
1:上传文件实例 public void UploadXMLLog(string xmlpath) { NameValueCollection nvc = ne ...
- C#使用HttpWebRequest和HttpWebResponse上传文件示例
C#使用HttpWebRequest和HttpWebResponse上传文件示例 1.HttpHelper类: 复制内容到剪贴板程序代码 using System; using System.Coll ...
- 在WinForm中通过HTTP协议向服务器端上传文件(转)
相信用ASP.NET写一个上传文件的网页,大家都会写,但是有没有人想过通过在WinForm中通过HTTP协议上传文件呢? 有些人说要向服务器端上传文件,用FTP协议不是很简单吗?效率又高,为什么还要使 ...
- C# winform 上传文件 (多种方案)
方案一: 注意:要开启虚拟目录的"写入"权限,要不然就报 403 错误 工作中用到winform上传文件(-_-!,很少用winform,搞了半天) 碰到一点问题,解决如下 1.5 ...
- c#同时上传文件和参数,Java接收的完整教程,炒鸡简单!网上的教程弱爆了!
工作需求,需要在c#端将文件和数据进行上传,Java端接收文件上传到oss,将数据处理到数据库. 这个教程,秒杀市面百分九十九的帖子,绝对是楼主精心打造! 一.网上的一般做法 网上搜出来的教程,基本都 ...
- C# winform 上传文件 (多种)
转:http://www.cnblogs.com/7in10/archive/2008/05/20/1203402.html 方案一: 注意:要开启虚拟目录的"写入"权限,要不然就 ...
- c#客户端上传文件到服务器
场景描述: 特别声明 以下代码也是我从网络上复制的别人的,但是一开始跑我这边有点报错就稍微调整了一下.同时也是记录一下 服务端接口接受一个客户端上传的文件流后进行后续的业务操作. 客户端: Modle ...
- smartupload 上传文件时 把页面编码改成gbk 解决乱码
快来java1234 吧 smartupload 上传文件时,经常会发生因为把表单设置为 enctype="multipart/form-data"而出现的中文乱码问题,本人头疼好 ...
- 关于上传文件的跨域问题
在进行新框架开发的过程中,需要自定义页面组件实现脱离表单的文件(图片)上传,考虑过wex5自带的attachmentsimple的自定义写法很难受,就改用了第三方插件webuploader来实现选择文 ...
最新文章
- 十类最让前辈讨厌的新人
- [operator]ubuntu + git
- sqlserver中select造成死锁
- burp suite 二级域名扫描插件
- Flutter Mac下环境配置
- python爬虫基础扫盲之urllib.pase解析URL
- 如何查看oracle客户端的版本,如何查看Oracle客户端版本
- python实现将点云的.bin格式文件转化为.txt格式
- Poi-tl通过word模板生成文件页眉页脚冲突问题
- 小程序向webview传参_h5与小程序互相跳转,传参和获取参数
- 为啥扫描服务器端口无响应,服务器端口扫描工具
- 如何在Mac上使用“剪切和粘贴”
- angular.js:13920 Error: [$injector:unpr] Unknown provider: $scopeProvider - $scope - testServe
- unity 获取两个向量夹角
- using 用法拾忆
- 外行学计算机,《新手无忧学电脑:外行入门学电脑(2008至尊经典版)》低价购书_计算机与互联网_孔网...
- 数据结构精录总结Episode.6 数据结构入门之树(基于Visual C++)
- 三只松鼠、盐津铺子:战略相似,命运迥异
- VASP MAGMOM设置
- Mimicking Very Efficient Network for Object Detection