实现思路主要参考这里
https://www.cnblogs.com/yinq/p/6045995.html
,代码在此基础上做了一点改进。
大体说一下我理解的Post请求:
-
首先Post请求所带的内容(包括参数、文件)都是二进制格式的,所以我们要把这些内容都转换为二进制格式添加到Post请求中。
-
每单个内容之间都有一个分隔符,头尾也需要这个分隔符,这个分隔符是可以自定义的。
这么总结下来内容真的少,具体Post格式可以参考上面那篇文章,然后我们需要做的就是按照这个格式去拼接Post请求。
//上传文件以及相关参数
//POST请求分隔符,可任意定制
string Boundary = "wojuedezhgexiangmushigekeng";
//构造请求参数
Dictionary<string, string> PostInfo = new Dictionary<string, string>();
PostInfo.Add("参数名1", 参数值1);
PostInfo.Add("参数名2", 参数值2);
PostInfo.Add("参数名3", 参数值3);
//构造POST请求体
StringBuilder PostContent = new StringBuilder("--" + Boundary);
byte[] ContentEnd = Encoding.UTF8.GetBytes("--" + Boundary + "--\r\n");//请求体末尾,后面会用到
//组成普通参数信息
foreach (KeyValuePair<string, string> item in PostInfo)
{
PostContent.Append("\r\n")
.Append("Content-Disposition: form-data; name=\"")
.Append(item.Key + "\"").Append("\r\n")
.Append("\r\n").Append(item.Value).Append("\r\n")
.Append("--").Append(Boundary);
}
//转换为二进制数组,后面会用到
byte[] PostContentByte = Encoding.UTF8.GetBytes(PostContent.ToString());
//文件信息
byte[] UpdateFile = File2Bytes("文件路径");//转换为二进制
StringBuilder FileContent = new StringBuilder();
FileContent.Append("\r\n")
.Append("Content-Type:application/octet-stream")
.Append("\r\n")
.Append("Content-Disposition:form-data; name=\"")
.Append("文件名"+ "\"; ")
.Append("filename=\"")
.Append("文件路径"+ "\\" + "文件名"+ "\"")
.Append("\r\n\r\n");
byte[] FileContentByte = Encoding.UTF8.GetBytes(FileContent.ToString());
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "POST";
request.Timeout = 20000;
//这里确定了分隔符是什么
request.ContentType = "multipart/form-data;boundary=" + Boundary;
//定义请求流
Stream myRequestStream = request.GetRequestStream();
myRequestStream.Write(PostContentByte, 0, PostContentByte.Length);//写入参数
myRequestStream.Write(FileContentByte, 0, FileContentByte.Length);//写入文件信息
myRequestStream.Write(UpdateFile, 0, UpdateFile.Length);//文件写入请求流中
myRequestStream.Write(ContentEnd, 0, ContentEnd.Length);//写入结尾
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
//获取返回值
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myRequestStream.Close();
myStreamReader.Close();
myResponseStream.Close();
附上一个上面用到的读取文件为二进制数组的方法
/// <summary>
/// 读取文件为二进制
/// </summary>
/// <param name="FilePath"></param>
/// <returns></returns>
public static byte[] File2Bytes(string FilePath)
{
if (!System.IO.File.Exists(FilePath))
{
return new byte[0];
}
FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read);
byte[] buff = new byte[fs.Length];
fs.Read(buff, 0, Convert.ToInt32(fs.Length));
fs.Close();
return buff;
}
大体就是这样了,也算简单易懂吧
版权声明:本文为qq_41731938原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。