咨询区

  • 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 上传文件?相关推荐

  1. C# 使用HttpWebRequest通过PHP接口 上传文件

    1:上传文件实例 public void UploadXMLLog(string xmlpath)         {             NameValueCollection nvc = ne ...

  2. C#使用HttpWebRequest和HttpWebResponse上传文件示例

    C#使用HttpWebRequest和HttpWebResponse上传文件示例 1.HttpHelper类: 复制内容到剪贴板程序代码 using System; using System.Coll ...

  3. 在WinForm中通过HTTP协议向服务器端上传文件(转)

    相信用ASP.NET写一个上传文件的网页,大家都会写,但是有没有人想过通过在WinForm中通过HTTP协议上传文件呢? 有些人说要向服务器端上传文件,用FTP协议不是很简单吗?效率又高,为什么还要使 ...

  4. C# winform 上传文件 (多种方案)

    方案一: 注意:要开启虚拟目录的"写入"权限,要不然就报 403 错误 工作中用到winform上传文件(-_-!,很少用winform,搞了半天) 碰到一点问题,解决如下 1.5 ...

  5. c#同时上传文件和参数,Java接收的完整教程,炒鸡简单!网上的教程弱爆了!

    工作需求,需要在c#端将文件和数据进行上传,Java端接收文件上传到oss,将数据处理到数据库. 这个教程,秒杀市面百分九十九的帖子,绝对是楼主精心打造! 一.网上的一般做法 网上搜出来的教程,基本都 ...

  6. C# winform 上传文件 (多种)

    转:http://www.cnblogs.com/7in10/archive/2008/05/20/1203402.html 方案一: 注意:要开启虚拟目录的"写入"权限,要不然就 ...

  7. c#客户端上传文件到服务器

    场景描述: 特别声明 以下代码也是我从网络上复制的别人的,但是一开始跑我这边有点报错就稍微调整了一下.同时也是记录一下 服务端接口接受一个客户端上传的文件流后进行后续的业务操作. 客户端: Modle ...

  8. smartupload 上传文件时 把页面编码改成gbk 解决乱码

    快来java1234 吧 smartupload 上传文件时,经常会发生因为把表单设置为 enctype="multipart/form-data"而出现的中文乱码问题,本人头疼好 ...

  9. 关于上传文件的跨域问题

    在进行新框架开发的过程中,需要自定义页面组件实现脱离表单的文件(图片)上传,考虑过wex5自带的attachmentsimple的自定义写法很难受,就改用了第三方插件webuploader来实现选择文 ...

最新文章

  1. 十类最让前辈讨厌的新人
  2. [operator]ubuntu + git
  3. sqlserver中select造成死锁
  4. burp suite 二级域名扫描插件
  5. Flutter Mac下环境配置
  6. python爬虫基础扫盲之urllib.pase解析URL
  7. 如何查看oracle客户端的版本,如何查看Oracle客户端版本
  8. python实现将点云的.bin格式文件转化为.txt格式
  9. Poi-tl通过word模板生成文件页眉页脚冲突问题
  10. 小程序向webview传参_h5与小程序互相跳转,传参和获取参数
  11. 为啥扫描服务器端口无响应,服务器端口扫描工具
  12. 如何在Mac上使用“剪切和粘贴”
  13. angular.js:13920 Error: [$injector:unpr] Unknown provider: $scopeProvider - $scope - testServe
  14. unity 获取两个向量夹角
  15. using 用法拾忆
  16. 外行学计算机,《新手无忧学电脑:外行入门学电脑(2008至尊经典版)》低价购书_计算机与互联网_孔网...
  17. 数据结构精录总结Episode.6 数据结构入门之树(基于Visual C++)
  18. 三只松鼠、盐津铺子:战略相似,命运迥异
  19. VASP MAGMOM设置
  20. Mimicking Very Efficient Network for Object Detection

热门文章

  1. 『JavaScript』核心
  2. ALV Styles in Field catalogue using OOPS
  3. SCCM 2007系列教程之三日志文件
  4. html的 button点击事件无效,InfoWindow里面加button,监听button点击事件无效 求解啊...
  5. 乘基取整法是什么_十进制小数转二进制小数乘2取整法的直观理解
  6. Windows应用程序开发
  7. 你的知识死角不能否定你的技术能力
  8. (3)Python3笔记之变量与运算符
  9. 安装mongoDB遇见的一个路径问题
  10. 服务发现与健康监测框架Consul-DNS转发的应用