Blazor应用文件上传失败:IOException异常求助
解决Blazor文件上传IOException异常的方案
针对代码中出现的文件创建成功但流复制失败、抛出System.IO.IOException的问题,可从以下几个方向排查修复:
确保目标目录存在
即便文件能被创建,若_Receipts目录不存在,流复制操作仍可能因父目录缺失报错。在创建文件流前先检查并创建目录:string relativePath = Path.Combine(appRoot, "_Receipts", Filename); // 创建目录(不存在则创建) Directory.CreateDirectory(Path.GetDirectoryName(relativePath));放宽InputFile流大小限制
Blazor的OpenReadStream()默认限制最大为512KB,上传文件超过该大小会触发IOException。手动指定更大的上限:// 示例设置为10MB,单位为字节 await e.File.OpenReadStream(10 * 1024 * 1024).CopyToAsync(fs);检查目录写入权限
应用运行身份(如IIS应用池用户、本地调试的当前用户)若无_Receipts目录的写入权限,会导致流复制失败。需给对应用户添加该目录的写入权限。修复文件后缀提取逻辑
原代码中若文件名包含多个点(如invoice.v2.pdf),IndexOf(".")会取第一个点的位置,导致后缀提取错误。改用Path.GetExtension()安全获取后缀:string suffix = Path.GetExtension(e.File.Name); Filename = Guid.NewGuid().ToString() + suffix;
修正后的完整代码
public async Task uploadReceipt(InputFileChangeEventArgs e) { // 安全获取文件后缀 string suffix = Path.GetExtension(e.File.Name); Filename = Guid.NewGuid().ToString() + suffix; string appRoot = AppDomain.CurrentDomain.BaseDirectory; string relativePath = Path.Combine(appRoot, "_Receipts", Filename); // 确保目标目录存在 Directory.CreateDirectory(Path.GetDirectoryName(relativePath)); using (FileStream fs = new FileStream(relativePath, FileMode.Create)) { // 设置10MB的流大小限制 await e.File.OpenReadStream(10 * 1024 * 1024).CopyToAsync(fs); } }
内容的提问来源于stack exchange,提问作者Kai Herrmann
相关产品推荐
相关产品推荐

