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();
        }

代码测试过,已经使用了。这个是修改版,删除了一些其他东西,仅是借鉴作用。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Collections.Specialized;
 4 using System.Globalization;
 5 using System.IO;
 6 using System.Linq;
 7 using System.Net;
 8 using System.Text;
 9 using System.Web;
10 
11 /// <summary>
12 /// UploadFile 的摘要说明
13 /// </summary>
14 public class UploadFile
15 {
16     public UploadFile()
17     {
18         ContentType = "application/octet-stream";
19     }
20     public string ContentType { get; set; }
21 
22 
23     public byte[] UploadFiles(string address, HttpFileCollection postedFiles,List<byte[]> lstBytes,NameValueCollection values)
24     {
25         var request = WebRequest.Create(address);
26         request.Method = "POST";
27         var boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x", NumberFormatInfo.InvariantInfo);
28         request.ContentType = "multipart/form-data; boundary=" + boundary;
29         boundary = "--" + boundary;
30 
31         using (var requestStream = request.GetRequestStream())
32         {
33             // Write the values
34             foreach (string name in values.Keys)
35             {
36                 var buffer = Encoding.UTF8.GetBytes(boundary + Environment.NewLine);
37                 requestStream.Write(buffer, 0, buffer.Length);
38                 buffer = Encoding.UTF8.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"{1}{1}", name, Environment.NewLine));
39                 requestStream.Write(buffer, 0, buffer.Length);
40                 buffer = Encoding.UTF8.GetBytes(values[name] + Environment.NewLine);
41                 requestStream.Write(buffer, 0, buffer.Length);
42             }
43 
44             // Write the files
45             for (int i = 0; i < postedFiles.Count; i++)
46             {
47                 HttpPostedFile file = postedFiles[i];
48 
49                 var buffer = Encoding.UTF8.GetBytes(boundary + Environment.NewLine);
50                 requestStream.Write(buffer, 0, buffer.Length);
51                 
52                 buffer = Encoding.UTF8.GetBytes(string.Format("Content-Type: {0}{1}", ContentType, Environment.NewLine));
53                 requestStream.Write(buffer, 0, buffer.Length);
54                 
55                 buffer = Encoding.UTF8.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"{2}{2}", postedFiles.GetKey(i), postedFiles.GetKey(i).ToLower() + Path.GetExtension(file.FileName), Environment.NewLine));
56                 requestStream.Write(buffer, 0, buffer.Length);
57 
58                 //将bytes转换为流,可以反复读取,适用于同一个文件需要发送给多个接口的情况
59                 if (lstBytes != null && lstBytes.Any() && lstBytes.Count == postedFiles.Count)
60                 {
61                     Stream newStream = new MemoryStream(lstBytes[i]);
62                     newStream.CopyTo(requestStream);
63                 }
64                 else
65                 {
66                     file.InputStream.CopyTo(requestStream);
67                 }
68 
69                 buffer = Encoding.UTF8.GetBytes(Environment.NewLine);
70                 requestStream.Write(buffer, 0, buffer.Length);
71             }
72 
73             var boundaryBuffer = Encoding.UTF8.GetBytes(boundary + "--");
74             requestStream.Write(boundaryBuffer, 0, boundaryBuffer.Length);
75         }
76 
77         using (var response = request.GetResponse())
78         using (var responseStream = response.GetResponseStream())
79         using (var stream = new MemoryStream())
80         {
81             responseStream.CopyTo(stream);
82             return stream.ToArray();
83         }
84     }
85 }

 

如有不足,请各位大大指正。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM