客户端传递文件给 Web API 接口
1.拼接 URI,对于需要传递的参数
我们可以根据自己的需要将其放置在 QueryString 里,或者报文体中,我这里只是一个无意义的参数,直接放到 QueryString 里,有两种拼接方式:
//对于地址拼接,第一种方式
uri += $"?watermark={watermark}";
//使用 UriBuilder
UriBuilder uriBuilder = new UriBuilder(uri);
uriBuilder.Query = $"watermark={watermark}";
2.读取文件,并设置其内容类型
//读取文件
using FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
HttpContent fileContent = new StreamContent(fileStream);
fileContent.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data"));
3.将数据添加到 MultipartFormDataContent 类对象中
这里可以使用 Add 方法添加我们需要添加的数据
1.如果是 文件类型的数据, 一定要给其 Add 方法第三个参数赋该文件的名,不然在 Web API 接口中的 Action方法调用 FromFormAttribute 特性识别不出来
2. 文件一般再 Web API 接口处获取时设置为 IFormFile 类型,其定义了用于处理上传文件的成员,可以轻松地对上传的文件进行操作
//MultipartFormDataContent类是一个专门用于存放multipart表单数据的类,通过其Add方法可以将表单数据加进去。
using MultipartFormDataContent formData = new MultipartFormDataContent();
//如果是文件的话,一定要将文件名加上,才能在 Controller Action 方法里 [FromForm]调用到
formData.Add(fileContent, "File", Path.GetFileName(path));
//可以添加多个
//formData.Add(new StringContent("test"), "Test");
4.根据 URI 地址将数据发送过去
HttpResponseMessage httpResponse = await HClient.PostAsync(fileUri, formData);
Web API 接口接受到指定地址传过来的数据
如果 MultipartFormDataContent 对象里 只添加了一个数据,可以直接声明一个对应类型的参数,前面调用 FromFormAttribute 特性
参数名一定要和 MultipartFormDataContent 所添加进去的数据所指定的名字一样
[HttpPost]
public void AddWatermark(string watermark, [FromForm] IFormFile File)
{
}
如果 MultipartFormDataContent 对象里添加了多个数据,可以直接声明一个类,在这个类中声明对应个数的参数,同理参数类型,和名字一定要和定义的时候一样,然后再前面调用 FromFormAttribute 特性
public void AddWatermark(string watermark, [FromForm] FromFormParm parm)
{
IFormFile file = parm.File;
string test = parm.Test;
}
public class FromFormParm
{
public IFormFile File { get; set; }
public string Test { get; set; }
}
客户端总代码:
/// <summary>
/// 上传文件内容
/// </summary>
/// <returns></returns>
public async Task<HttpResponseMessage> UploadFilesAsync(string uri, string path, string watermark, ContentTypeEnum ContentTypeEnum = ContentTypeEnum.Application_Json)
{
try
{
//对于地址拼接,第一种方式
//uri += $"?watermark={watermark}";
//使用 UriBuilder
UriBuilder uriBuilder = new UriBuilder(uri);
uriBuilder.Query = $"watermark={watermark}";
Uri fileUri = uriBuilder.Uri;
//读取文件
using FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
HttpContent fileContent = new StreamContent(fileStream);
fileContent.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data"));
//MultipartFormDataContent类是一个专门用于存放multipart表单数据的类,通过其Add方法可以将表单数据加进去。
using MultipartFormDataContent formData = new MultipartFormDataContent();
//如果是文件的话,一定要将文件名加上,才能在 Controller Action 方法里 [FromForm]调用到
formData.Add(fileContent, "File", Path.GetFileName(path));
//可以添加多个
//formData.Add(new StringContent("test"), "Test");
HttpResponseMessage httpResponse = await HClient.PostAsync(fileUri, formData);
return httpResponse;
}
catch(Exception e)
{
throw new Exception (e.Message);
}
}