说明:1.WebRequest类是一个抽象类,所以上传类实际使用的是其子类

2.打开Fiddler软件,监视正常网页的文件上传,可以看到http协议的请求和响应信息,简略说明

(第一行:请求说明

POST http://localhost/UpLoad.aspx HTTP/1.1 (请求类型:post,请求地址: http://localhost/UpLoad.aspx,http协议类型:HTTP/1.1)

第二行至多行:请求头(一系列的 key:value)

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Content-Type: multipart/form-data;charset=utf-8;boundary=8D30475B6E5BB4C
Host:localhost
Content-Length: 22194
Expect: 100-continue
Connection: Close

换行,第n行:请求体

响应类似,详细见fiddler。

3.通过查看fiddler监测的http请求过程,可以利用webrequest模拟http请求,代码如下:

  1. private void UploadFile(string path)
  2. {
  3. try
  4. {
  5. if (!string.IsNullOrEmpty(path))
  6. {
  7. string filename = Path.GetFileName(path); //获取文件名称
  8. LogWrite("上传文件", "开始上传文件,文件名称" + filename, null);
  9. string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
  10. HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost/UpLoad.aspx");
  11. request.ServicePoint.ConnectionLimit = ; //设置最大连接数
    request.ServicePoint.Expect100Continue = false;//解决webexception操作超时
  12. request.Method = "POST"; //请求方法
  13. #region ==请求头===
  14. request.KeepAlive = false; //请求连接方式,设置为请求完成后断开连接
  15. request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0";
  16. request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
  17. request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
  18. #endregion
  19. byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");//分割线数据
  20. byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");//结束分割线数据
  21. StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n", filename));
  22. byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString()); //上传文件头数据
  23. string sbheader2 = string.Format("Content-Disposition:form-data;name=\"ws\"\r\n\r\nother");//其他的form表单数据,这里为:form["ws"]="other"
  24. byte[] ddd = Encoding.UTF8.GetBytes(sbheader2);
  25. FileStream fs = new FileStream(path, FileMode.Open);//读取文件
  26. byte[] bArr = new byte[fs.Length];
  27. long filesize = fs.Length;
  28. fs.Read(bArr, , (int)filesize);
  29. fs.Close();
  30. request.ContentLength = itemBoundaryBytes.Length * + ddd.Length + postHeaderBytes.Length + filesize + endBoundaryBytes.Length;//设置请求长度,一定要设置,否则可能会引发请求超时的异常
  31. Stream sm = request.GetRequestStream(); //获取请求流
  32. sm.Write(itemBoundaryBytes, , itemBoundaryBytes.Length);//写入分割线数据
  33. sm.Write(ddd, , ddd.Length); //写入表单数据
  34. sm.Write(itemBoundaryBytes, , itemBoundaryBytes.Length);//写入分割线数据
  35. sm.Write(postHeaderBytes, , postHeaderBytes.Length);//写入上传文件头数据
  36.  
  37. long size = ;
  38. float percent = ; //上传进度
  39. //分步上传
  40. while (size < filesize)
  41. {
  42. if (filesize - size > )
  43. {
  44. sm.Write(bArr, (int)size, );
  45. size += ;
  46. }
  47. else
  48. {
  49. sm.Write(bArr, (int)size, (int)(filesize - size));
  50. size = filesize;
  51. }
  52. percent = size / (float)filesize;
  53. }
  54. //sm.Write(bArr, 0, bArr.Length);
  55.  
  56. sm.Write(endBoundaryBytes, , endBoundaryBytes.Length); //写入结束分割线
  57. sm.Close();
  58. HttpWebResponse response = (HttpWebResponse)request.GetResponse(); //获取响应
  59. Stream sss = response.GetResponseStream();
  60. LogWrite("上传文件", response.StatusCode.ToString() + filename, null);
  61.  
  62. //Stream sss = request.GetResponse().GetResponseStream();
  63. StreamReader sr = new StreamReader(sss);
  64. string ret = sr.ReadToEnd();
  65. sr.Close();
  66. LogWrite("上传文件", "结束上传文件,返回结果" + ret, null);
  67. //资源释放
  68. response.Close();
  69. request.Abort();
  70. System.GC.Collect();
  71. }
  72. }
  73. catch (Exception ex)
  74. {
  75. LogWrite("上传文件发生异常", "", ex);
  76. }
  77.  
  78. }

4.注意:一定要设置request.ContentLength的大小,否则可能引发操作超时的异常信息。

利用WebRequest类上传文件的更多相关文章

  1. 使用javax.servlet.http.Part类上传文件

    使用的是Servlet 3.0 新的特征标注(Annotaion)类描述部署,一些低版本的服务器需要使用标准依赖部署描述文件(web.xml)来部署,另外Part也是Java EE 6.0新增的类,P ...

  2. 如何利用 Jmeter 测试上传文件

    在查看本文的前提,有如下几点: 会使用Jmeter,知道如何去添加http请求的sampler 会利用Jmeter完成基本的http请求或者是接口测试 知道文件上传是怎么回事 言归正传,其实文件上传我 ...

  3. H5利用formData来上传文件(包括图片,doc,pdf等各种格式)方法小结!

    H5页面中我们常需要进行文件上传,那么怎么来实现这个功能呢??? 我主要谈如下两种方法. (一).传统的form表单方法 <form action="/Home/SaveFile1&q ...

  4. 利用百度云盘API上传文件至百度云盘

    一.获取Access Token示例 1. 请您将以下HTTP请求直接粘贴到浏览器地址栏内,并按下回车键. https://openapi.baidu.com/oauth/2.0/authorize? ...

  5. 利用ServletFileUpload组件上传文件

    自己的运用: public void UploadNoteFile(HttpServletRequest request,HttpServletResponse response){  String ...

  6. C语言 HTTP上传文件-利用libcurl库上传文件

    原文  http://justwinit.cn/post/7626/ 通常情况下,一般很少使用C语言来直接上传文件,但是遇到使用C语言编程实现文件上传时,该怎么做呢? 借助开源的libcurl库,我们 ...

  7. linux下 利用 rz 命令上传文件

    1. 如何安装? 1)编译安装  root 账号登陆后,依次执行以下命令: # cd /tmp # wget http://www.ohse.de/uwe/releases/lrzsz-0.12.20 ...

  8. 小白向:web中利用request.getPart()上传文件到服务器

    被文件上传弄得焦头烂额的一天,果然web中的路径和各种设置真的好讨厌= = 下面是超级小白的.及其简约的“详”解 1.明确目的: 用户将 1.txt 文件 上传到 服务器(web工程下的某个文件夹)中 ...

  9. 利用formdata对象上传文件时,需要添加的参数

    function doUpload() { var formData = new FormData($( "#uploadForm" )[0]); $.ajax({ url: 'h ...

随机推荐

  1. iOS 多线程学习笔记 —— NSOperation

    本文复制.参考自文章:iOS多线程编程之NSOperation和NSOperationQueue的使用 ,主要为了加强个人对知识的理解和记忆,不做他用.原作者声明: 著作权声明:本文由http://b ...

  2. POJ 2260(ZOJ 1949) Error Correction 一个水题

    Description A boolean matrix has the parity property when each row and each column has an even sum, ...

  3. godaddy.com 注册域名 买卖域名

    https://www.godaddy.com/domains/searchresults.aspx?ci=83269&checkAvail=1&domainToCheck=ses.x ...

  4. UVA 10561 Treblecross(博弈论)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32209 [思路] 博弈论. 根据X分布划分禁区,每个可以放置的块为 ...

  5. 错误137(net::ERR_NAME_RESOLUTION_FAILED):未知错误的解决办法

    现象:之前遇到一些新闻网站打不开的情况...而让异地的朋友打开却能打开.. 解决①:配置dns ,因为公司内部的网络是桥接的 我们dns服务器默认是192.168.1.1 ,dns被封锁,直接导致一些 ...

  6. Python爬取CSDN博客文章

    0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.win ...

  7. ASP.NET中的文件上传大小限制的问题

    一.文件大小限制的问题 首先我们来说一下如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改WEB.Config文 ...

  8. poj 2926 Requirements

    点击打开poj 2926 思路: n维空间计算最远的曼哈顿距离 分析: 1 题目给定n个5维的点,要求最远的曼哈顿距离 2 求最远曼哈顿距离,对于一个n维的空间,其中两点的曼哈顿距离为:|x1-x2| ...

  9. Delphi 颜色转换

    http://files.cnblogs.com/xe2011/StringToColor.rar unit Unit1; interface uses Windows, Messages, SysU ...

  10. Node.js小Httpserver

    须要说明两点: 1 程序文件hello.js需用记事本另存为utf-8格式的hello.js watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamVhcGVk ...