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

