c# Post请求上传文件,附带参数

  • Post author:
  • Post category:其他


实现思路主要参考这里

https://www.cnblogs.com/yinq/p/6045995.html

,代码在此基础上做了一点改进。

大体说一下我理解的Post请求:

  1. 首先Post请求所带的内容(包括参数、文件)都是二进制格式的,所以我们要把这些内容都转换为二进制格式添加到Post请求中。

  2. 每单个内容之间都有一个分隔符,头尾也需要这个分隔符,这个分隔符是可以自定义的。

这么总结下来内容真的少,具体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 版权协议,转载请附上原文出处链接和本声明。