C#使用HttpClient上传文件(multipart表单)

简介: C#使用HttpClient上传文件(multipart表单)

有时候需要使用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对象,为响应内容,再调用其ContentReadAsStringAsync方法可以读取响应内容为字符串,这也是异步方法,不过还是向上面一样调用其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实例之后,使用HttpClientSendAsync方法即可。

相关文章
|
1月前
|
XML JSON 前端开发
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
316 0
|
6月前
|
数据采集 C# 数据安全/隐私保护
掌握 C# 爬虫技术:使用 HttpClient 获取今日头条内容
本文介绍了如何使用C#的HttpClient与爬虫代理IP技术抓取今日头条内容,以实现高效的数据采集。通过结合亿牛云爬虫代理,可以绕过IP限制,增强匿名性。文中提供了一个代码示例,展示如何设置代理服务器信息、请求头,并用正则表达式提取热点新闻标题。利用多线程技术,能提升爬虫采集效率,为市场分析等应用提供支持。
147 1
掌握 C# 爬虫技术:使用 HttpClient 获取今日头条内容
|
数据采集 数据可视化 数据挖掘
C#和HttpClient结合示例:微博热点数据分析
微博是中国最大的社交媒体平台之一,它每天都会发布各种各样的热点话题,反映了网民的关注点和舆论趋势。本文将介绍如何使用C#语言和HttpClient类来实现一个简单的爬虫程序,从微博网站上抓取热点话题的数据,并进行一些基本的分析和可视化。
C#和HttpClient结合示例:微博热点数据分析
|
存储 XML JSON
C# HttpClient 请求认证、数据传输笔记
C# HttpClient 请求认证、数据传输笔记
868 0
C# HttpClient 请求认证、数据传输笔记