namespace WebApi.Controllers; /// /// 账单导入控制器 /// [ApiController] [Route("api/[controller]/[action]")] public class BillImportController( ILogger logger, IImportService importService ) : ControllerBase { /// /// 上传账单文件 /// /// 账单文件 /// 账单类型(Alipay | WeChat) /// [HttpPost] public async Task UploadFile( [FromForm] IFormFile file, [FromForm] string type ) { try { // 验证参数 if (file.Length == 0) { return "请选择要上传的文件".Fail(); } if (string.IsNullOrWhiteSpace(type) || (type != "Alipay" && type != "WeChat")) { return "账单类型参数错误,必须是 Alipay 或 WeChat".Fail(); } // 验证文件类型 var allowedExtensions = new[] { ".csv", ".xlsx", ".xls" }; var fileExtension = Path.GetExtension(file.FileName).ToLowerInvariant(); if (!allowedExtensions.Contains(fileExtension)) { return "只支持 CSV 或 Excel 文件格式".Fail(); } // 验证文件大小(10MB限制) const long maxFileSize = 10 * 1024 * 1024; if (file.Length > maxFileSize) { return "文件大小不能超过 10MB".Fail(); } // 保存文件 var ok = false; var message = string.Empty; await using (var stream = new MemoryStream()) { await file.CopyToAsync(stream); if (type == "Alipay") { (ok, message) = await importService.ImportAlipayAsync(stream, fileExtension); } else if (type == "WeChat") { (ok, message) = await importService.ImportWeChatAsync(stream, fileExtension); } } if (!ok) { return message.Fail(); } return message.Ok(); } catch (Exception ex) { logger.LogError(ex, "文件上传失败,类型: {Type}", type); return $"文件上传失败: {ex.Message}".Fail(); } } }