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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:52:47