有时候需要使用C#发送网络请求,其中上传文件其实也是使用POST请求。方式也有很多,除了自己组装数据之外,还可以使用HttpClient
发送。
上传文件使用HttpClient
类其实可以很简单的实现。
1,实例化MultipartFormDataContent
类组装表单
在C#中,MultipartFormDataContent
类是一个专门用于存放multipart
表单数据的类,通过其Add
方法可以将表单数据加进去。
假设这里有个上传文件的接口如下:
地址:/upload
方法:POST
参数:
字段 | 类型 | 描述 |
name | String | 名字 |
file | File | 文件 |
也就是说,表单项有一个字符串类型字段,和一个文件,这个时候在C#组装表单如下:
// 读取文件StreamfileStream=newFileStream(@"C:\Users\swsk33\Pictures\wallpaper-2x\gz-3.png", FileMode.Open, FileAccess.Read); // 实例化multipart表单模型varformData=newMultipartFormDataContent(); // 设定文本类型表单项,使用StringContent存放字符串formData.Add(newStringContent("测试图片"), "name"); // 设定文件类型表单项,使用StreamContent存放文件流formData.Add(newStreamContent(fileStream), "file", "a.png");
可见MultipartFormDataContent
的方法Add
可以把我们的表单项加进去,上面第一个Add
中第一个参数是StringContent
类型,用于存放字符串,第二个参数为接口要求的字段。
第二个Add
参数中有三个参数,第一个为StreamContent
,存放待上传的文件流,可以看到可以先用FileStream
读取文件为文件流再存入,第二个参数为接口要求的字段,第三个参数为文件名,可以自己起,但是扩展名最好是和原来保持一致。
添加文件除了直接放入文件流之外,还可以先读取为字节数据存入,效果一样:
StreamfileStream=newFileStream(@"C:\Users\swsk33\Pictures\wallpaper-2x\gz-3.png", FileMode.Open, FileAccess.Read); byte[] data=newbyte[fileStream.Length]; fileStream.Read(data, 0, data.Length); fileStream.Close(); formData.Add(newByteArrayContent(data), key, "gz-3.png");
这样,表单就组装完毕了!
2,实例化HttpClient
发送请求
这个就很简单了:
// 实例化HttpClientHttpClientclient=newHttpClient(); // 发送请求HttpResponseMessageresult=client.PostAsync("http://127.0.0.1:8806/upload", formData).Result; // 接受结果stringresponseResult=result.Content.ReadAsStringAsync().Result; // 打印结果Console.WriteLine(responseResult); client.Dispose(); fileStream.Close();
HttpClient
有一个PostAsync
方法表示发送POST请求,第一个参数为请求地址,第二个为刚刚组装的表单对象,这是一个异步方法,不过向上述一样调用其返回值的Result
可以等待其完成,这样会返回一个HttpResponseMessage
对象,为响应内容,再调用其Content
的ReadAsStringAsync
方法可以读取响应内容为字符串,这也是异步方法,不过还是向上面一样调用其Result
可以等待其完成。
这样就完成了上传文件请求。
3,自定义请求参数
上面的操作其实是一个“简写”,如果需要自定义请求头等等,需要先定义HttpRequestMessage
对象(表示一个Http请求)设定其中请求头、请求内容等等,再使用HttpClient
发送即可。
// 实例化HttpRequestMessage对象HttpRequestMessagerequestMessage=newHttpRequestMessage(); // 设定请求类型为POSTrequestMessage.Method=HttpMethod.Post; // 设定请求地址requestMessage.RequestUri=newUri("http://www.example.com/upload"); // 实例化multipart表单模型varformData=newMultipartFormDataContent(); // ...省略加入内容至表单的过程...// 设置请求体为上述multipart表单requestMessage.Content=formData; // 设定Content-Typerequest.Content.Headers.ContentType=newMediaTypeHeaderValue("application/json"); // 加入其他自定义请求头,这里以UA为例,还可以设定其它自定义请求头(注意Content-Type在这里设置是无效的,必须按照上面一行设置)requestMessage.Headers.TryAddWithoutValidation("User-Agent", "xxx..."); // 实例化HttpClientHttpClientclient=newHttpClient(); // 发送请求HttpResponseMessageresult=client.SendAsync(requestMessage).Result; // 接受结果stringresponseResult=result.Content.ReadAsStringAsync().Result; // 打印结果Console.WriteLine(responseResult);
自定义HttpRequestMessage
实例之后,使用HttpClient
的SendAsync
方法即可。