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

