C# 上传文件和数据到后台webapi
今天收到一个上传文档到后台文档的需求,使用客户端模拟上传文件和对应的数据到后台服务中,后台负责保存数据
主要使用: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;
}
}
}说明:上传文件的时候需要分好顺序,有文件开头和结束的地方。