You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Kiota MultiPart搭配IFormFileCollection实现带附件的POST请求

问题描述

在多解决方案共享项目中使用Kiota生成HTTP客户端,其余功能正常,但调用后端POST接口时遇到附件上传的问题。

后端接口定义:

[HttpPost]
public async Task<ActionResult> Post([FromForm] CreateUserCommand command)
    => Ok(await _mediator.Send(command)); 

CreateUserCommand类包含附件属性:

public class CreateUserCommand : IRequest<bool>
{
    public CreateUserCommand ()
    {
    }

    public string Email { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
    public string Phone { get; set; }
    public IFormFileCollection Attachements { get; set; } = new FormFileCollection();
}

Kiota生成的客户端方法签名:

public async Task<Int32BooleanResultResponse?> PostAsync(MultipartBody body, Action<RequestBuilderPostRequestConfiguration>? requestConfiguration = default, CancellationToken cancellationToken = default) 

目前已尝试构造MultipartBody但不知道如何添加附件:

var multipartBody = new MultipartBody();

multipartBody.AddOrReplacePart("email", "application/json", applyCommand.Email);
multipartBody.AddOrReplacePart("address", "application/json", applyCommand.Address);
multipartBody.AddOrReplacePart("firstName", "application/json", applyCommand.FirstName);
multipartBody.AddOrReplacePart("lastName", "application/json", applyCommand.LastName);
multipartBody.AddOrReplacePart("phone", "application/json", applyCommand.Phone);

需要指导如何正确构造请求,发送用户信息及附件文件。

解决方案

要处理文件上传,需使用MultipartBody的AddOrReplacePart重载方法,直接传入文件流、文件名及对应Content-Type。由于后端接收的是IFormFileCollection类型,多个附件需使用相同的参数名(即类中定义的Attachements)添加。

完整构造示例如下:

// 示例:从本地读取要上传的文件
var filePath = "path/to/your/file.pdf";
var fileName = Path.GetFileName(filePath);
using var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);

var multipartBody = new MultipartBody();

// 添加普通表单字段
multipartBody.AddOrReplacePart("email", "application/json", applyCommand.Email);
multipartBody.AddOrReplacePart("address", "application/json", applyCommand.Address);
multipartBody.AddOrReplacePart("firstName", "application/json", applyCommand.FirstName);
multipartBody.AddOrReplacePart("lastName", "application/json", applyCommand.LastName);
multipartBody.AddOrReplacePart("phone", "application/json", applyCommand.Phone);

// 添加单个附件
multipartBody.AddOrReplacePart(
    name: "Attachements", // 与后端类中的属性名保持一致
    contentType: "application/pdf", // 根据文件类型设置正确的Content-Type
    content: fileStream,
    fileName: fileName // 后端IFormFile会获取此文件名
);

// 若需上传多个附件,重复调用AddOrReplacePart即可,参数名保持"Attachements"不变
var anotherFilePath = "path/to/another/image.jpg";
var anotherFileName = Path.GetFileName(anotherFilePath);
using var anotherFileStream = new FileStream(anotherFilePath, FileMode.Open, FileAccess.Read);
multipartBody.AddOrReplacePart(
    name: "Attachements",
    contentType: "image/jpeg",
    content: anotherFileStream,
    fileName: anotherFileName
);

// 调用Kiota生成的PostAsync方法发送请求
var response = await client.PostAsync(multipartBody);

关键说明

  • 针对IFormFileCollection类型参数,所有上传文件必须使用相同的参数名,后端才能正确解析为集合。
  • 需根据文件类型指定正确的contentType,如图片用image/jpeg、PDF用application/pdf,通用二进制文件可使用application/octet-stream。
  • 文件流需确保在请求发送期间保持打开状态,推荐使用using块包裹流,并在块内完成请求调用。

内容的提问来源于stack exchange,提问作者Ghassen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:32:23