c#代码发送post请求,上传文件(并带其他参数)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

c#代码发送post请求,上传⽂件(并带其他参数)
本⼈对post理解不深,前段时间遇到⼀个需要⽤c#代码发送post请求上传⽂件的业务,于是参考了⼏篇帖⼦,加上⾃⾝实践写出了如下代码。

写的⽐较low 望各位⼤⼤指正^_^。

业务需求:
对⽅给了⼀个接⼝,让传四个参数分别为“modelId、fileContent、updateTime、encrypt”
其中modelId、updateTime、encrypt 都是普通的字符串类型。

fileContent则是⼆进制⽂件
我实在是不了解post的相关知识,平时只是普通的⽤法,没有深层看过相关知识。

于是我⽤html页⾯写⼀个form表单提交,然后拦截⼀下查看了请求头与请求体中的内容(这只是传⼀个普通的⽂本⽂件所以fileConten中能显⽰普通⽂本,如果是图⽚之类的⽂件这⾥都是乱码)。

这⾥⾯画圈圈的都是我认为⽐较重要的地⽅。

看这些信息我得出
请求头中:
content-Type: multipart/form-data
boundary=ceshi(感觉应该是分隔符的意思,“ceshi”是我随便写的)
请求体中是按照⼀定格式拼的串,⼤致就是--ceshi **** --ceshi **** --ceshi **** --ceshi-- 这样的格式。

因为最终是发送请求流,这些请求体中的内容都需要写进请求流中,虽然有些事字符串这种⽂本类型的数据,但是⽂件本⾝是⼆进制的,所以我就把所有⽂本都变成了⼆进制,再加上⽂件本⾝,
然后按照这种格式的顺序写⼊请求流中,最后发送出去(如果不变成⼆进制,则只能进⾏⽂本类型的⽂件上传,限制很多,并且容易损坏⽂件)。

代码如下:
把C盘下的2.html⽂件发送了出去(图⽚、pdf 等类型也是可⽤的,因为都是转成了⼆进制)已经过测试
private void post1()
{
string url = @"http://*******";//这⾥就不暴露我们的地址啦
string modelId = "4f1e2e3d-6231-4b13-96a4-835e5af10394";
string updateTime = "2016-11-03 14:17:25";
string encrypt = "f933797503d6e2c36762428a280e0559";
string filePath = @"C:/2.html";
string fileName = "2.html";
byte[] fileContentByte = new byte[1024]; // ⽂件内容⼆进制
#region将⽂件转成⼆进制
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
fileContentByte = new byte[fs.Length]; // ⼆进制⽂件
fs.Read(fileContentByte, 0, Convert.ToInt32(fs.Length));
fs.Close();
#endregion
#region定义请求体中的内容并转成⼆进制
string boundary = "ceshi";
string Enter = "\r\n";
string modelIdStr = "--" + boundary + Enter
+ "Content-Disposition: form-data; name=\"modelId\"" + Enter + Enter
+ modelId + Enter;
string fileContentStr = "--" + boundary + Enter
+ "Content-Type:application/octet-stream" + Enter
+ "Content-Disposition: form-data; name=\"fileContent\"; filename=\"" + fileName + "\"" + Enter + Enter;
string updateTimeStr = Enter + "--" + boundary + Enter
+ "Content-Disposition: form-data; name=\"updateTime\"" + Enter + Enter
+ updateTime;
string encryptStr = Enter + "--" + boundary + Enter
+ "Content-Disposition: form-data; name=\"encrypt\"" + Enter + Enter
+ encrypt + Enter + "--" + boundary + "--";
var modelIdStrByte = Encoding.UTF8.GetBytes(modelIdStr);//modelId所有字符串⼆进制
var fileContentStrByte = Encoding.UTF8.GetBytes(fileContentStr);//fileContent⼀些名称等信息的⼆进制(不包含⽂件本⾝)var updateTimeStrByte = Encoding.UTF8.GetBytes(updateTimeStr);//updateTime所有字符串⼆进制
var encryptStrByte = Encoding.UTF8.GetBytes(encryptStr);//encrypt所有字符串⼆进制
#endregion
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "multipart/form-data;boundary=" + boundary;
Stream myRequestStream = request.GetRequestStream();//定义请求流
#region将各个⼆进制安顺序写⼊请求流 modelIdStr -> (fileContentStr + fileContent) -> uodateTimeStr -> encryptStr
myRequestStream.Write(modelIdStrByte, 0, modelIdStrByte.Length);
myRequestStream.Write(fileContentStrByte, 0, fileContentStrByte.Length);
myRequestStream.Write(fileContentByte, 0, fileContentByte.Length);
myRequestStream.Write(updateTimeStrByte, 0, updateTimeStrByte.Length);
myRequestStream.Write(encryptStrByte, 0, encryptStrByte.Length);
#endregion
HttpWebResponse response = (HttpWebResponse)request.GetResponse();//发送
Stream myResponseStream = response.GetResponseStream();//获取返回值
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
}
代码测试过,已经使⽤了。

这个是修改版,删除了⼀些其他东西,仅是借鉴作⽤。

如有不⾜,请各位⼤⼤指正。

相关文档
最新文档