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

ASP.Net Core 3.1中使用Blueimp jQuery Upload插件出现「Empty file upload result」错误的排查求助

我帮你梳理下这个问题的排查方向和修复方案,毕竟从ASP.NET Core 2.2升级到3.1后出现Blueimp上传报错,大概率是框架默认行为的变化导致的,我们一步步来:

排查与修复ASP.NET Core 3.1中Blueimp文件上传的「Empty file upload result」错误

一、优先排查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」错误。

修复方式二选一:

  1. 把字段改成属性(推荐,符合.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(),不用循环
        }
    }
    
  2. 切回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:18:13