如何使用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
相关产品推荐
相关产品推荐

