You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Web API如何将文件数据作为方法参数接收适配NSwag代码生成?

直接将文件作为Web API方法参数接收的方案

完全理解你的需求——直接把文件作为方法参数接收,既能让代码更清晰,又能让NSwag这类工具生成正确的TypeScript客户端,不用再手动处理Request.Content那套繁琐的逻辑。下面是具体的实现方案:

单文件上传的实现

在ASP.NET Core Web API中,你可以直接使用IFormFile类型作为方法参数,框架会自动解析multipart/form-data请求中的文件内容:

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.IO;
using System.Threading.Tasks;

[ApiController]
[Route("api/[controller]")]
public class FilesController : ControllerBase
{
    [HttpPost("upload")]
    public async Task<IActionResult> UploadSingleFile(IFormFile file, string? fileDescription = null)
    {
        // 校验文件是否存在
        if (file == null || file.Length == 0)
        {
            return BadRequest("请选择要上传的文件");
        }

        // 示例:将文件保存到临时目录
        var tempFilePath = Path.Combine(Path.GetTempPath(), file.FileName);
        using (var fileStream = new FileStream(tempFilePath, FileMode.Create))
        {
            await file.CopyToAsync(fileStream);
        }

        // 返回文件信息
        return Ok(new 
        { 
            FileName = file.FileName, 
            FileSize = file.Length, 
            Description = fileDescription 
        });
    }
}

多文件上传的实现

如果需要支持一次上传多个文件,只需将参数改为IEnumerable<IFormFile>List<IFormFile>

[HttpPost("upload-multiple")]
public async Task<IActionResult> UploadMultipleFiles(IEnumerable<IFormFile> files)
{
    var uploadedFiles = new List<object>();

    foreach (var file in files)
    {
        if (file.Length == 0) continue;

        var tempFilePath = Path.Combine(Path.GetTempPath(), file.FileName);
        using (var fileStream = new FileStream(tempFilePath, FileMode.Create))
        {
            await file.CopyToAsync(fileStream);
        }

        uploadedFiles.Add(new 
        { 
            FileName = file.FileName, 
            FileSize = file.Length 
        });
    }

    return Ok(new { UploadedCount = uploadedFiles.Count, Files = uploadedFiles });
}

为什么这样能让NSwag生成正确的客户端

因为你明确声明了方法参数的类型(IFormFile或其集合),NSwag会自动识别这是一个multipart/form-data类型的请求,并生成对应的TypeScript客户端代码。生成的客户端会帮你自动构建FormData对象,你只需要传入文件和其他参数即可,比如:

// NSwag生成的客户端示例代码
async uploadSingleFile(file: File | null, fileDescription?: string): Promise<UploadResult> {
    const formData = new FormData();
    if (file) formData.append('file', file);
    if (fileDescription !== undefined) formData.append('fileDescription', fileDescription);
    
    const response = await this.http.post('/api/files/upload', formData);
    return response.data;
}

这种方式完全替代了手动处理Request.Content的老旧写法,代码更易读、易维护,同时完美支持API文档和客户端代码生成工具。

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

火山引擎 最新活动