c#使用HttpWebRequest上传文件同时携带其他参数

这个小程序参考了另一位博友的代码,做了稍许调整,创建的两个Handler程序,一个上传的ashx,一个接收的ashx

上传文件代码

public void ProcessRequest(HttpContext context)
		{
			//参考http://www.cnblogs.com/greenerycn/archive/2010/05/15/csharp_http_post.html
			string filePath = "d:\\apple4.jpg";
			string fileName = "apple4.jpg";
			string postURL = "http://192.168.1.11/testhandler/accfile.ashx";
			
			// 边界符
			var boundary = "---------------" + DateTime.Now.Ticks.ToString("x");
			var beginBoundary = Encoding.ASCII.GetBytes("--" + boundary + "\r\n");
			var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);

			// 最后的结束符
			var endBoundary = Encoding.ASCII.GetBytes("--" + boundary + "--\r\n");

			// 文件参数头
			const string filePartHeader =
				"Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" +
				 "Content-Type: application/octet-stream\r\n\r\n";
			var fileHeader = string.Format(filePartHeader, "file", fileName);
			var fileHeaderBytes = Encoding.UTF8.GetBytes(fileHeader);

			// 开始拼数据
			var memStream = new MemoryStream();
			memStream.Write(beginBoundary, 0, beginBoundary.Length);

			// 文件数据
			memStream.Write(fileHeaderBytes, 0, fileHeaderBytes.Length);
			var buffer = new byte[1024];
			int bytesRead; // =0
			while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
			{
				memStream.Write(buffer, 0, bytesRead);
			}
			fileStream.Close();

			// Key-Value数据
			var stringKeyHeader = "\r\n--" + boundary +
								   "\r\nContent-Disposition: form-data; name=\"{0}\"" +
								   "\r\n\r\n{1}\r\n";

			Dictionary<string, string> stringDict = new Dictionary<string, string>();
			stringDict.Add("len", "500");
			stringDict.Add("wid", "300");
			foreach (byte[] formitembytes in from string key in stringDict.Keys
											 select string.Format(stringKeyHeader, key, stringDict[key])
												 into formitem
												 select Encoding.UTF8.GetBytes(formitem))
			{
				memStream.Write(formitembytes, 0, formitembytes.Length);
			}

			// 写入最后的结束边界符
			memStream.Write(endBoundary, 0, endBoundary.Length);

			//倒腾到tempBuffer?
			memStream.Position = 0;
			var tempBuffer = new byte[memStream.Length];
			memStream.Read(tempBuffer, 0, tempBuffer.Length);
			memStream.Close();

			// 创建webRequest并设置属性
			var webRequest = (HttpWebRequest)WebRequest.Create(postURL);
			webRequest.Method = "POST";
			webRequest.Timeout = 100000;
			webRequest.ContentType = "multipart/form-data; boundary=" + boundary;
			webRequest.ContentLength = tempBuffer.Length;

			var requestStream = webRequest.GetRequestStream();
			requestStream.Write(tempBuffer, 0, tempBuffer.Length);
			requestStream.Close();

			var httpWebResponse = (HttpWebResponse)webRequest.GetResponse();
			string responseContent;
			using (var httpStreamReader = new StreamReader(httpWebResponse.GetResponseStream(),Encoding.GetEncoding("utf-8")))
			{
				responseContent = httpStreamReader.ReadToEnd();
			}

			httpWebResponse.Close();
			webRequest.Abort();

			context.Response.ContentType = "text/plain";
			context.Response.Write(responseContent);
		}

接收文件

public void ProcessRequest(HttpContext context)
		{
			context.Response.ContentType = "text/plain";
			if (context.Request.Files.Count == 0)
			{
				context.Response.Write("No file");
				return;
			}

			HttpPostedFile f1 = context.Request.Files[0];
			System.Drawing.Image image = System.Drawing.Image.FromStream(f1.InputStream);
			image.Save("d:\\upload.jpg");
			
			string strPars="";
			foreach (var key in context.Request.Form.AllKeys)
			{
				string val = context.Request[key];
				strPars += "["+key + ":" + val + "] ";
			}

			image.Dispose();
			context.Response.Write("OK Get File:" + f1.FileName + " Pars:" + strPars);
		}



  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值