ASP.Net Core 3.1中使用Blueimp jQuery Upload插件出现「Empty file upload result」错误的排查求助
我帮你梳理下这个问题的排查方向和修复方案,毕竟从ASP.NET Core 2.2升级到3.1后出现Blueimp上传报错,大概率是框架默认行为的变化导致的,我们一步步来:
一、优先排查JSON序列化问题(最可能的根因)
ASP.NET Core 3.1有个关键变化:默认把JSON序列化器从Newtonsoft.Json换成了System.Text.Json。而这两个序列化器有个核心差异——System.Text.Json默认只序列化公共属性,不会序列化公共字段。
看你的JsonFiles类:
public class JsonFiles { public ViewDataUploadFilesResult[] files; // 这是公共字段,不是属性 // ...构造函数 }
这会导致服务端返回的JSON里根本没有files数组,Blueimp插件接收不到预期的上传结果,直接抛出「Empty file upload result」错误。
修复方式二选一:
把字段改成属性(推荐,符合.NET最佳实践)
给files加上get/set访问器,同时用特性指定JSON键为小写的files(匹配Blueimp的期望):using System.Text.Json.Serialization; public class JsonFiles { [JsonPropertyName("files")] public ViewDataUploadFilesResult[] Files { get; set; } public JsonFiles(List<ViewDataUploadFilesResult> filesList) { Files = filesList.ToArray(); // 这里可以简化成ToArray(),不用循环 } }切回Newtonsoft.Json序列化器
如果不想修改类结构,直接在Startup.cs中配置回旧的序列化器:public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews() .AddNewtonsoftJson(); // 新增这一行,恢复2.2的序列化行为 }
二、检查服务端获取文件的逻辑
确保UploadAndReturnResult方法能正确拿到上传的文件。ASP.NET Core 3.1推荐通过方法参数注入IFormFile来接收文件,比直接读取Request.Form.Files更稳妥:
public async Task<JsonResult> Upload(Guid id, IFormFile file) { try { if (file == null || file.Length == 0) { return Json(new { error = "未检测到上传文件" }); } // 把file传入UploadAndReturnResult处理 var resultList = UploadAndReturnResult(id, file); JsonFiles files = new JsonFiles(resultList); return Json(files); } catch (Exception e) { return Json(new { error = $"上传失败:{e.Message}" }); } }
如果是多文件上传,换成IEnumerable<IFormFile>作为参数即可。
三、验证请求管道配置
检查Startup.cs里的中间件顺序,确保UseStaticFiles在UseRouting之前(保证Blueimp的JS/CSS资源能正常加载),中间件顺序大概是这样:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // ...其他中间件 app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
同时确认没有自定义中间件拦截了multipart请求,导致文件数据丢失。
四、前端调试确认请求内容
用浏览器F12开发者工具的Network标签,查看上传请求的详情:
- 检查Request Payload/Form Data,确认文件数据确实发送到了服务端
- 查看服务端返回的JSON,确认是否包含
files数组(这一步能快速验证序列化问题是否解决)
按照以上步骤排查,最可能解决问题的就是JSON序列化的调整,这也是2.2升级到3.1最容易忽略的差异点。
内容的提问来源于stack exchange,提问作者TheFallenOne

