今天收到一个上传文档到后台文档的需求,使用客户端模拟上传文件和对应的数据到后台服务中,后台负责保存数据
主要使用:HttpWebRequest,WebResponse 对象操作
1、 HttpWebRequest 类支持在定义 WebRequest 的属性和方法,以及使用户能够使用 HTTP 与服务器直接交互的其他属性和方法。
2、WebResponse 是 abstract
派生特定于协议的响应类的基类。 应用程序可以使用类的 WebResponse 实例以与协议无关的方式参与请求和响应事务,而派生自 WebResponse 执行请求详细信息的特定于协议的类。
上传文件的方法:
public static string Upload3(string url, string filepath, string wenjianid, string authon) { var fileName = Path.GetFileName(filepath); var fileContentByte = File.ReadAllBytes(filepath); // 二进制文件 #region 定义请求体中的内容 并转成二进制 string boundary = "qianle"; string Enter = "\r\n"; string wenjianIdStr = "--" + boundary + Enter + "Content-Disposition: form-data; name=\"wenjianid\"" + Enter + Enter + wenjianid; var wenjianIdStrByte = Encoding.UTF8.GetBytes(wenjianIdStr);//wenjianid所有字符串二进制 string fileContentStr = "Content-Type:application/octet-stream" + Enter + "Content-Disposition: form-data; name=\"filename\"; filename=\"" + fileName + "\"" + Enter + Enter; var fileContentStrByte = Encoding.UTF8.GetBytes(fileContentStr);//fileContent一些名称等信息的二进制(不包含文件本身) byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n"); //文件开始表示 byte[] byteEnd = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n"); //结束标识 --xxxx-- #endregion HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "multipart/form-data;boundary=" + boundary; request.Headers.Add("Authorization", authon); using (Stream myRequestStream = request.GetRequestStream())//定义请求流 { #region 将各个二进制 安顺序写入请求流 wenjianIdStr -> (itemBoundaryBytes + itemBoundaryBytesfileContentStr + fileContent+ byteEnd) myRequestStream.Write(wenjianIdStrByte, 0, wenjianIdStrByte.Length); myRequestStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length); myRequestStream.Write(fileContentStrByte, 0, fileContentStrByte.Length); myRequestStream.Write(fileContentByte, 0, fileContentByte.Length); myRequestStream.Write(byteEnd, 0, byteEnd.Length); #endregion } using (WebResponse resp = request.GetResponse()) { using (StreamReader sr = new StreamReader(resp.GetResponseStream())) { string result = sr.ReadToEnd(); return result; } } }
说明:上传文件的时候需要分好顺序,有文件开头和结束的地方。