ASP.NET Core Web API 利用 FromFormAttribute 传递文件数据

本文介绍了如何在客户端通过拼接URI、读取文件、设置Content-Type,然后使用MultipartFormDataContent将文件和参数发送给WebAPI接口的过程,包括文件名的指定和接收端的Action方法处理。
摘要由CSDN通过智能技术生成

客户端传递文件给 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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值