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

如何从WPF向Swagger发送[FromForm]文件?求示例指导

实现WPF向带[FromForm]标记的Swagger接口上传文件

后端ASP.NET Core接口定义

首先需要在后端定义支持[FromForm]的文件上传接口,同时配置Swagger以支持文件上传的UI展示:

控制器代码

[ApiController]
[Route("api/files")]
public class FileUploadController : ControllerBase
{
    [HttpPost("upload")]
    public async Task<IActionResult> UploadFile([FromForm] IFormFile file)
    {
        if (file == null || file.Length == 0)
        {
            return BadRequest("未选择有效文件");
        }

        // 示例:将文件保存到服务器指定目录
        var uploadDir = Path.Combine(Directory.GetCurrentDirectory(), "Uploads");
        Directory.CreateDirectory(uploadDir);
        var savePath = Path.Combine(uploadDir, file.FileName);

        using (var stream = new FileStream(savePath, FileMode.Create))
        {
            await file.CopyToAsync(stream);
        }

        return Ok(new { Message = "文件上传成功", SavedPath = savePath });
    }
}

Swagger配置(Program.cs)

为了让Swagger UI显示文件上传控件,需要在Swagger配置中添加文件类型的Schema映射:

builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "FileUploadAPI", Version = "v1" });

    // 配置IFormFile的Swagger Schema,支持文件上传UI
    c.MapType<IFormFile>(() => new OpenApiSchema
    {
        Type = "string",
        Format = "binary"
    });

    // 可选:添加XML注释,让接口说明更清晰
    var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
    c.IncludeXmlComments(xmlPath);
});

// 可选:配置大文件上传的请求限制
builder.Services.Configure<FormOptions>(options =>
{
    options.MultipartBodyLengthLimit = 104857600; // 允许最大100MB的文件
});

WPF端上传实现

WPF中使用HttpClient构造MultipartFormDataContent来发送表单数据,配合OpenFileDialog选择本地文件:

前端代码示例

using Microsoft.Win32;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Windows;

private async void UploadFileBtn_Click(object sender, RoutedEventArgs e)
{
    var openFileDialog = new OpenFileDialog
    {
        Filter = "所有文件 (*.*)|*.*|图片文件 (*.png;*.jpg)|*.png;*.jpg",
        Title = "选择要上传的文件"
    };

    if (openFileDialog.ShowDialog() != true) return;

    var filePath = openFileDialog.FileName;
    var fileName = Path.GetFileName(filePath);

    using var httpClient = new HttpClient();
    using var multipartContent = new MultipartFormDataContent();

    // 读取文件流并添加到表单内容中
    using var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
    var fileContent = new StreamContent(fileStream);
    fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream");

    // 注意:这里的参数名"file"必须和后端接口的参数名完全一致
    multipartContent.Add(fileContent, "file", fileName);

    // 发送请求到后端接口地址(替换为你的实际接口地址)
    var response = await httpClient.PostAsync("https://localhost:5001/api/files/upload", multipartContent);

    if (response.IsSuccessStatusCode)
    {
        var result = await response.Content.ReadAsStringAsync();
        MessageBox.Show($"上传成功:\n{result}", "提示");
    }
    else
    {
        var errorMsg = await response.Content.ReadAsStringAsync();
        MessageBox.Show($"上传失败:\n{errorMsg}", "错误");
    }
}

关键注意事项

  • 参数名一致性:WPF端添加文件时的参数名(示例中的"file")必须和后端接口的[FromForm]参数名完全匹配,否则无法正确绑定。
  • Swagger测试:启动后端服务后,可直接在Swagger UI中测试接口是否正常,确认没问题后再对接WPF代码。
  • HttpClient优化:如果是MVVM模式的WPF应用,建议使用IHttpClientFactory注入HttpClient,避免频繁创建实例。
  • 异常处理:实际项目中需要添加更多异常捕获逻辑(如网络异常、文件读取异常等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:27:18