c#中通常使用HttpWebRequest进行HTTP网络请求,HttpWebRequest只对Http请求进行了最简单的封装。如果要利用Http协议实现多文件上传,则必须使用POST方法multipart/form-data格式。为了重复使用,我封装了几个方法,实现了多参数文件上传。
添加引用
使用WebRequest需要添加引用System.Web,否则引入出错。
参数封装
方便起见,我把请求参数进行了封装,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
namespace EasyHttp.Net.Core { public class KeyValue { public string Key; public string Value; public string FilePath; public string ContentType= "*/*" ; public KeyValue( string key, string value, string filePath, string contentType) { Key = key; Value = value; FilePath = filePath; ContentType = contentType; } public KeyValue() { } public KeyValue( string key, string value, string filePath) { Key = key; Value = value; FilePath = filePath; } public KeyValue( string key, string value) { Key = key; Value = value; } } } |
KeyValue代表了广义的参数,可以是普通的键值对,也可以是文件参数。
多文件上传封装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
public static void ExecuteMultipartRequest(HttpWebRequest request, List<KeyValue> nvc) { Console.WriteLine(request.Headers); // log.Debug(string.Format("Uploading {0} to {1}", file, url)); string boundary = "---------------------------" + DateTime.Now.Ticks.ToString( "x" ); byte [] boundarybytes = System.Text.Encoding.ASCII.GetBytes( "\r\n--" + boundary + "\r\n" ); HttpWebRequest wr = request; wr.ContentType = "multipart/form-data; boundary=" + boundary; wr.Method = "POST" ; wr.KeepAlive = true ; wr.Credentials = System.Net.CredentialCache.DefaultCredentials; using (var rs = wr.GetRequestStream()) { // 普通参数模板 string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}" ; //带文件的参数模板 string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n" ; foreach (KeyValue keyValue in nvc) { //如果是普通参数 if (keyValue.FilePath == null ) { rs.Write(boundarybytes, 0, boundarybytes.Length); string formitem = string .Format(formdataTemplate, keyValue.Key, keyValue.Value); byte [] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem); rs.Write(formitembytes, 0, formitembytes.Length); } //如果是文件参数,则上传文件 else { rs.Write(boundarybytes, 0, boundarybytes.Length); string header = string .Format(headerTemplate, keyValue.Key, keyValue.FilePath, keyValue.ContentType); byte [] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); rs.Write(headerbytes, 0, headerbytes.Length); using (var fileStream = new FileStream(keyValue.FilePath, FileMode.Open, FileAccess.Read)) { byte [] buffer = new byte [4096]; int bytesRead = 0; long total = 0; while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) { rs.Write(buffer, 0, bytesRead); total += bytesRead; } } } } byte [] trailer = System.Text.Encoding.ASCII.GetBytes( "\r\n--" + boundary + "--\r\n" ); rs.Write(trailer, 0, trailer.Length); } } |
使用
1
2
3
4
5
6
7
8
9
10
11
|
static void Main( string [] args) { var request = WebRequest.Create( "http://localhost:8080/test/upload" ) as HttpWebRequest; List<KeyValue> keyValues = new List<KeyValue>(); keyValues.Add( new KeyValue( "key1" , "param1" )); keyValues.Add( new KeyValue( "key2" , "param2" )); keyValues.Add( new KeyValue( "file" , "test1.png" , "image/png" )); keyValues.Add( new KeyValue( "file" , "test2.png" , "image/png" )); EasyHttp.ExecuteMultipartRequest(request,keyValues); } |
以上就是c# 使用WebRequest实现多文件上传的详细内容,更多关于c# 多文件上传的资料请关注服务器之家其它相关文章!
原文链接:https://chenkaihua.com/2016/08/24/c-webrequest-multpart-multi-file-upload/