调用POST方法上传文件和文本

 

  1 public static void request()
  2         {
  3             string filepath = path;
  4             var formDatas = new List<FormItemModel>();
  5             //添加文件
  6             formDatas.Add(new FormItemModel()
  7             {
  8                 Key = "file",
  9                 Value = "File",
 10                 FileName = fileName,
 11                 FileContent = File.OpenRead(filepath)
 12             });
 13             var result = PostForm(url, formDatas);
 14 
 15         }
 16 
 17         public static string PostForm(string url, List<FormItemModel> formItems, CookieContainer cookieContainer = null, string refererUrl = null, Encoding encoding = null, int timeOut = 20000)
 18         {
 19             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
 20             #region 初始化请求对象
 21             request.Method = "POST";
 22             request.Timeout = timeOut;
 23             request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
 24             request.KeepAlive = true;
 25             request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36";
 26             if (!string.IsNullOrEmpty(refererUrl))
 27                 request.Referer = refererUrl;
 28             if (cookieContainer != null)
 29                 request.CookieContainer = cookieContainer;
 30             #endregion
 31 
 32             string boundary = "----" + DateTime.Now.Ticks.ToString("x");//分隔符
 33             request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);
 34             //请求流
 35             var postStream = new MemoryStream();
 36             #region 处理Form表单请求内容
 37             //是否用Form上传文件
 38             var formUploadFile = formItems != null && formItems.Count > 0;
 39             if (formUploadFile)
 40             {
 41                 //文件数据模板
 42                 string fileFormdataTemplate =
 43                     "\r\n--" + boundary +
 44                     "\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"" +
 45                     "\r\nContent-Type: application/octet-stream" +
 46                     "\r\n\r\n";
 47                 //文本数据模板
 48                 string dataFormdataTemplate =
 49                     "\r\n--" + boundary +
 50                     "\r\nContent-Disposition: form-data; name=\"{0}\"" +
 51                     "\r\n\r\n{1}";
 52                 foreach (var item in formItems)
 53                 {
 54                     string formdata = null;
 55                     if (item.IsFile)
 56                     {
 57                         //上传文件
 58                         formdata = string.Format(
 59                             fileFormdataTemplate,
 60                             item.Key, //表单键
 61                             item.FileName);
 62                     }
 63                     else
 64                     {
 65                         //上传文本
 66                         formdata = string.Format(
 67                             dataFormdataTemplate,
 68                             item.Key,
 69                             item.Value);
 70                     }
 71 
 72                     //统一处理
 73                     byte[] formdataBytes = null;
 74                     //第一行不需要换行
 75                     if (postStream.Length == 0)
 76                         formdataBytes = Encoding.UTF8.GetBytes(formdata.Substring(2, formdata.Length - 2));
 77                     else
 78                         formdataBytes = Encoding.UTF8.GetBytes(formdata);
 79                     postStream.Write(formdataBytes, 0, formdataBytes.Length);
 80 
 81                     //写入文件内容
 82                     if (item.FileContent != null && item.FileContent.Length > 0)
 83                     {
 84                         using (var stream = item.FileContent)
 85                         {
 86                             byte[] buffer = new byte[1024];
 87                             int bytesRead = 0;
 88                             while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0)
 89                             {
 90                                 postStream.Write(buffer, 0, bytesRead);
 91                             }
 92                         }
 93                     }
 94                 }
 95                 //结尾
 96                 var footer = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
 97                 postStream.Write(footer, 0, footer.Length);
 98 
 99             }
100             else
101             {
102                 request.ContentType = "application/x-www-form-urlencoded";
103             }
104             #endregion
105 
106             request.ContentLength = postStream.Length;
107 
108             #region 输入二进制流
109             if (postStream != null)
110             {
111                 postStream.Position = 0;
112                 //直接写入流
113                 Stream requestStream = request.GetRequestStream();
114 
115                 byte[] buffer = new byte[1024];
116                 int bytesRead = 0;
117                 while ((bytesRead = postStream.Read(buffer, 0, buffer.Length)) != 0)
118                 {
119                     requestStream.Write(buffer, 0, bytesRead);
120                 }
121 
122                 ////debug
123                 //postStream.Seek(0, SeekOrigin.Begin);
124                 //StreamReader sr = new StreamReader(postStream);
125                 //var postStr = sr.ReadToEnd();
126                 postStream.Close();//关闭文件访问
127             }
128             #endregion
129 
130             HttpWebResponse response = (HttpWebResponse)request.GetResponse();
131             if (cookieContainer != null)
132             {
133                 response.Cookies = cookieContainer.GetCookies(response.ResponseUri);
134             }
135 
136             using (Stream responseStream = response.GetResponseStream())
137             {
138                 using (StreamReader myStreamReader = new StreamReader(responseStream, encoding ?? Encoding.UTF8))
139                 {
140                     string retString = myStreamReader.ReadToEnd();
141                     return retString;
142                 }
143             }
144         }

 

posted @ 2022-05-11 15:32  进击的黑大帅  阅读(718)  评论(0)    收藏  举报