C# HttpWebRequest 上传文件

 1  /// <summary>
 2     /// 上传文件
 3     /// </summary>
 4     /// <param name="url"></param>
 5     /// <param name="files"></param>
 6     /// <param name="data"></param>
 7     /// <param name="encoding"></param>
 8     /// <returns></returns>
 9     public static string HttpUploadFile(string url, string[] files, NameValueCollection data, Encoding encoding)
10     {
11         string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
12         byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
13         byte[] endbytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
14 
15         //1.HttpWebRequest
16         HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
17         request.ContentType = "multipart/form-data; boundary=" + boundary;
18         request.Method = "POST";
19         request.KeepAlive = true;
20         request.Credentials = CredentialCache.DefaultCredentials;
21 
22         using (Stream stream = request.GetRequestStream())
23         {
24             //1.1 key/value
25             string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
26             if (data != null)
27             {
28                 foreach (string key in data.Keys)
29                 {
30                     stream.Write(boundarybytes, 0, boundarybytes.Length);
31                     string formitem = string.Format(formdataTemplate, key, data[key]);
32                     byte[] formitembytes = encoding.GetBytes(formitem);
33                     stream.Write(formitembytes, 0, formitembytes.Length);
34                 }
35             }
36 
37             //1.2 file
38             string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n";
39             byte[] buffer = new byte[4096];
40             int bytesRead = 0;
41             for (int i = 0; i < files.Length; i++)
42             {
43                 stream.Write(boundarybytes, 0, boundarybytes.Length);
44                 string header = string.Format(headerTemplate, "file" + i, Path.GetFileName(files[i]));
45                 byte[] headerbytes = encoding.GetBytes(header);
46                 stream.Write(headerbytes, 0, headerbytes.Length);
47                 using (FileStream fileStream = new FileStream(files[i], FileMode.Open, FileAccess.Read))
48                 {
49                     while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
50                     {
51                         stream.Write(buffer, 0, bytesRead);
52                     }
53                 }
54             }
55 
56             //1.3 form end
57             stream.Write(endbytes, 0, endbytes.Length);
58         }
59         //2.WebResponse
60         HttpWebResponse response = (HttpWebResponse)request.GetResponse();
61         using (StreamReader stream = new StreamReader(response.GetResponseStream()))
62         {
63             return stream.ReadToEnd();
64         }
65     }

 

posted @ 2022-09-15 18:06  极客船长  阅读(1299)  评论(0编辑  收藏  举报