利用WebRequest类上传文件
说明: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请求,代码如下:
private void UploadFile(string path)
{
try
{
if (!string.IsNullOrEmpty(path))
{
string filename = Path.GetFileName(path); //获取文件名称
LogWrite("上传文件", "开始上传文件,文件名称" + filename, null);
string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost/UpLoad.aspx");
request.ServicePoint.ConnectionLimit = ; //设置最大连接数
request.ServicePoint.Expect100Continue = false;//解决webexception操作超时
request.Method = "POST"; //请求方法
#region ==请求头===
request.KeepAlive = false; //请求连接方式,设置为请求完成后断开连接
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
#endregion
byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");//分割线数据
byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");//结束分割线数据
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));
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString()); //上传文件头数据
string sbheader2 = string.Format("Content-Disposition:form-data;name=\"ws\"\r\n\r\nother");//其他的form表单数据,这里为:form["ws"]="other"
byte[] ddd = Encoding.UTF8.GetBytes(sbheader2);
FileStream fs = new FileStream(path, FileMode.Open);//读取文件
byte[] bArr = new byte[fs.Length];
long filesize = fs.Length;
fs.Read(bArr, , (int)filesize);
fs.Close();
request.ContentLength = itemBoundaryBytes.Length * + ddd.Length + postHeaderBytes.Length + filesize + endBoundaryBytes.Length;//设置请求长度,一定要设置,否则可能会引发请求超时的异常
Stream sm = request.GetRequestStream(); //获取请求流
sm.Write(itemBoundaryBytes, , itemBoundaryBytes.Length);//写入分割线数据
sm.Write(ddd, , ddd.Length); //写入表单数据
sm.Write(itemBoundaryBytes, , itemBoundaryBytes.Length);//写入分割线数据
sm.Write(postHeaderBytes, , postHeaderBytes.Length);//写入上传文件头数据 long size = ;
float percent = ; //上传进度
//分步上传
while (size < filesize)
{
if (filesize - size > )
{
sm.Write(bArr, (int)size, );
size += ;
}
else
{
sm.Write(bArr, (int)size, (int)(filesize - size));
size = filesize;
}
percent = size / (float)filesize;
}
//sm.Write(bArr, 0, bArr.Length); sm.Write(endBoundaryBytes, , endBoundaryBytes.Length); //写入结束分割线
sm.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); //获取响应
Stream sss = response.GetResponseStream();
LogWrite("上传文件", response.StatusCode.ToString() + filename, null); //Stream sss = request.GetResponse().GetResponseStream();
StreamReader sr = new StreamReader(sss);
string ret = sr.ReadToEnd();
sr.Close();
LogWrite("上传文件", "结束上传文件,返回结果" + ret, null);
//资源释放
response.Close();
request.Abort();
System.GC.Collect();
}
}
catch (Exception ex)
{
LogWrite("上传文件发生异常", "", ex);
} }
4.注意:一定要设置request.ContentLength的大小,否则可能引发操作超时的异常信息。
利用WebRequest类上传文件的更多相关文章
- 使用javax.servlet.http.Part类上传文件
使用的是Servlet 3.0 新的特征标注(Annotaion)类描述部署,一些低版本的服务器需要使用标准依赖部署描述文件(web.xml)来部署,另外Part也是Java EE 6.0新增的类,P ...
- 如何利用 Jmeter 测试上传文件
在查看本文的前提,有如下几点: 会使用Jmeter,知道如何去添加http请求的sampler 会利用Jmeter完成基本的http请求或者是接口测试 知道文件上传是怎么回事 言归正传,其实文件上传我 ...
- H5利用formData来上传文件(包括图片,doc,pdf等各种格式)方法小结!
H5页面中我们常需要进行文件上传,那么怎么来实现这个功能呢??? 我主要谈如下两种方法. (一).传统的form表单方法 <form action="/Home/SaveFile1&q ...
- 利用百度云盘API上传文件至百度云盘
一.获取Access Token示例 1. 请您将以下HTTP请求直接粘贴到浏览器地址栏内,并按下回车键. https://openapi.baidu.com/oauth/2.0/authorize? ...
- 利用ServletFileUpload组件上传文件
自己的运用: public void UploadNoteFile(HttpServletRequest request,HttpServletResponse response){ String ...
- C语言 HTTP上传文件-利用libcurl库上传文件
原文 http://justwinit.cn/post/7626/ 通常情况下,一般很少使用C语言来直接上传文件,但是遇到使用C语言编程实现文件上传时,该怎么做呢? 借助开源的libcurl库,我们 ...
- linux下 利用 rz 命令上传文件
1. 如何安装? 1)编译安装 root 账号登陆后,依次执行以下命令: # cd /tmp # wget http://www.ohse.de/uwe/releases/lrzsz-0.12.20 ...
- 小白向:web中利用request.getPart()上传文件到服务器
被文件上传弄得焦头烂额的一天,果然web中的路径和各种设置真的好讨厌= = 下面是超级小白的.及其简约的“详”解 1.明确目的: 用户将 1.txt 文件 上传到 服务器(web工程下的某个文件夹)中 ...
- 利用formdata对象上传文件时,需要添加的参数
function doUpload() { var formData = new FormData($( "#uploadForm" )[0]); $.ajax({ url: 'h ...
随机推荐
- 【索引】UML学习笔记
行为图 交互图 交互概览图 时间图 顺序图 通信图 活动图 状态及图 用例图 结构图 包图 类图 对象图 组件图 部署图 组合结构图
- SDH,WDM, OTN, MSTP,Ethernet, PTN, IP RAN
概要:对带宽的需求,加上IP化严重,光通信技术不断地进化.最早的技术就是SONET.SDH,后来的技术都是在此技术上不断地改进和发展,以太网技术是一种局域网技术. SDH带宽小,提高带宽出现了WDM波 ...
- 向MyEclipse中导入项目要注意的问题
如何导入 修改项目名称(路径) 修改类库 如何导入: 右键Package Explorer -> Import 如果是把别人的项目拷贝到自己的工程中,而且又改了项目名称,那么发布之前一定要改一个 ...
- Abator自动生成ibatis的相关配置和类
一.abator自动生成配置: abator自动生成ibatis的配置文件.mode.sqlMap.dao.bean实例 准备: 1.安装Eclipse插件: 要求eclipse3.1, ...
- Ehcache专栏
http://www.iteye.com/blogs/subjects/ehcache
- 传统IO与NIO区别二
nio是new io的简称,从jdk1.4就被引入了.现在的jdk已经到了1.6了,可以说不是什么新东西了.但其中的一些思想值得我来研究.这两天,我研究了下其中的套接字部分,有一些心得,在此分享. ...
- IAP内购 返回的产品数量为0
上个月搞IAP,提交到appstore审核被拒,根据附件截图 可以知道是请求产品信息的时候,产品数量返回0了. 返回产品数量为0 要么是Itunes Connect 里面的Contracts Tax ...
- Android 判断数据库中是否存在某个表
public boolean tabIsExist(String tabName){ boolean result = false; if(tabName == null){ return false ...
- 跟踪MYSQL 的查询优化过程方法
http://dev.mysql.com/doc/internals/en/tracing-example.html http://blog.chinaunix.net/uid-20785090-id ...
- 【Android】面试宝典
Android面试 1. 内容介绍................................................................................... ...