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 }