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

Blazor WebAssembly文件上传MySQL失败:Blob长度为0求助

Blazor WebAssembly文件上传MySQL,Blob字段仅存0长度字节数组排查

我在Blazor WebAssembly项目中尝试将文件上传至MySQL数据库,但Blob字段始终只存储长度为0的字节数组,相关代码如下,求排查问题:

Controller代码

[Route("api/[controller]")]
[ApiController]
public class FileController : Controller
{
    private readonly FileUploadDbContext _fileUploadDbContext;
    private readonly IFileUploadServices _fileUploadServices;
    public FileController(IFileUploadServices fileUploadServices, FileUploadDbContext fileUploadDbContext)
    {
        _fileUploadDbContext = fileUploadDbContext ?? throw new ArgumentNullException(nameof(fileUploadDbContext));
        _fileUploadServices = fileUploadServices;
    }

    [HttpGet]
    public async Task<ActionResult<IEnumerable<UploadFileInfo>>> Get()
    {
        await _fileUploadServices.GetUplaodFile();
        return Ok("file get");
    }

    [HttpPost]
    public async Task<ActionResult> Post(IFormFile formFile)
    {
        using (var ms = new MemoryStream())
        {
            formFile.CopyTo(ms);
            var fileBytes = ms.ToArray();
            string s = Convert.ToBase64String(fileBytes);
            // act on the Base64 data
            var fileinfo = new UploadFileInfo
            {
                Data = fileBytes,
                FileId = 1, //Ignore the 1, for testing purpose
                FileName = formFile.FileName,
            };
            await _fileUploadServices.UploadFiles(fileinfo);
            return Ok("file created");
        }
    }
}

Services代码

public class FileUploadServices : IFileUploadServices
{
    private readonly IDbContextFactory<FileUploadDbContext> _contextFactory;

    public FileUploadServices(IDbContextFactory<FileUploadDbContext> contextFactory)
    {
        _contextFactory = contextFactory;
    }

    public async Task UploadFiles(UploadFileInfo uploadFileInfos)
    {
        using (var context = _contextFactory.CreateDbContext())
        {
            context.fileUploadInfos.Add(uploadFileInfos);
            await context.SaveChangesAsync();
        }
    }

    public async Task<IList<UploadFileInfo>> GetUplaodFile()
    {
        using (var context = _contextFactory.CreateDbContext())
        {
            var uploadfiles = await context.fileUploadInfos.ToListAsync();
            return uploadfiles;
        }
    }
}

Model代码

public class UploadFileInfo
{
    [Key]
    public int FileId { get; set; }

    public string FileName { get; set; }
    public byte[] Data { get; set; }
}

Migration代码

public partial class mg1 : Migration
{
    /// <inheritdoc />
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AlterDatabase()
            .Annotation("MySQL:Charset", "utf8mb4");

        migrationBuilder.CreateTable(
            name: "fileUploadInfos",
            columns: table => new
            {
                FileId = table.Column<int>(type: "int", nullable: false)
                    .Annotation("MySQL:ValueGenerationStrategy", MySQLValueGenerationStrategy.IdentityColumn),
                FileName = table.Column<string>(type: "longtext", nullable: false),
                Data = table.Column<byte[]>(type: "longblob", nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_fileUploadInfos", x => x.FileId);
            })
            .Annotation("MySQL:Charset", "utf8mb4");
    }

    /// <inheritdoc />
    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "fileUploadInfos");
    }
}

调试时发现读取后的字节数组为空,数据库Blob字段也显示为空,恳请帮忙排查问题。


排查关键点

  • 前端请求格式验证:Blazor WASM上传文件必须使用multipart/form-data格式构造FormData,确保后端能正确接收IFormFile。如果前端未正确提交,formFile会是空对象,导致读取的字节数组长度为0。
  • 添加IFormFile有效性判断:在Controller的Post方法开头增加校验:
    if (formFile == null || formFile.Length == 0)
    {
        return BadRequest("未上传有效文件");
    }
    
  • 移除硬编码的主键值:Migration中已设置FileId为自增列,代码中手动设置FileId=1可能导致主键冲突,或EF Core内部逻辑异常,应删除该赋值,让数据库自动生成主键。
  • 捕获保存异常:在UploadFiles方法中添加异常捕获,确认保存时是否有未被处理的错误:
    public async Task UploadFiles(UploadFileInfo uploadFileInfos)
    {
        using (var context = _contextFactory.CreateDbContext())
        {
            try
            {
                context.fileUploadInfos.Add(uploadFileInfos);
                await context.SaveChangesAsync();
            }
            catch (Exception ex)
            {
                // 日志记录或输出异常详情
                throw;
            }
        }
    }
    
  • 确认上下文注入正确性:检查FileUploadDbContext的连接字符串是否指向目标数据库,避免操作了错误的数据库实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 18:24:59