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

指定路径文件未上传:C#代码错误排查咨询

C# 文件上传代码无报错但文件未生成的问题分析

我尝试用以下C#代码上传.png文件,代码执行无报错,指定路径的目录也成功创建了,但文件并没有上传到目标路径。已知fileSavePath的值为C:\Development\MedicalMonitor\Task\DEMO1001\Task1666027260354.png,请问代码里有没有错误?

原代码

public bool SaveFile(string Filepath, string FileContainer, string FileNewName)
{
    IMMAuthenticationManager iMMAuthenticationManager = null;
    IConfiguration iConfig = null;
    FileUtility FU = new FileUtility(iMMAuthenticationManager, iConfig);
    var file = HttpContext.Request.Form.Files[FileContainer];
    bool FileData = FU.FileUtilityUpload2(Filepath, file, FileNewName);
    return FileData;
}
public bool FileUtilityUpload2(string path, IFormFile file, string FileNewName)
{               
    if (file != null)
    {
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }

        if (file.FileName != "")
        {
            var ext = System.IO.Path.GetExtension(file.FileName);
            //uniqueName = Guid.NewGuid().ToString() + ext;
            string fileSavePath = Path.Combine(path, FileNewName);
            MemoryStream streamfileSavePath = new MemoryStream(Encoding.UTF8.GetBytes(fileSavePath));
            file.CopyToAsync(streamfileSavePath);
            return true;
        }          
    }
    return false;
}

代码错误分析

  • 核心错误:错误使用MemoryStream处理文件路径
    你创建的MemoryStream是把fileSavePath这个字符串转成字节流存在内存里,完全没有和磁盘文件关联,等于把路径文本写到了内存,根本没有将上传的文件内容写入目标路径。正确做法应该是创建指向目标文件的FileStream。

  • 异步方法未等待导致流提前终止
    file.CopyToAsync是异步方法,直接调用但不使用await等待执行完成,方法会立刻返回true,此时流可能还没完成写入就被回收,就算流的创建是正确的,也会导致文件写入失败或不完整。

修正后的代码

// 若保持同步调用,可修改为以下方式
public bool SaveFile(string Filepath, string FileContainer, string FileNewName)
{
    IMMAuthenticationManager iMMAuthenticationManager = null;
    IConfiguration iConfig = null;
    FileUtility FU = new FileUtility(iMMAuthenticationManager, iConfig);
    var file = HttpContext.Request.Form.Files[FileContainer];
    // 调用同步方法或等待异步方法完成
    bool FileData = FU.FileUtilityUpload2(Filepath, file, FileNewName).GetAwaiter().GetResult();
    return FileData;
}

// 推荐改为异步方法,符合.NET异步规范
public async Task<bool> FileUtilityUpload2(string path, IFormFile file, string FileNewName)
{               
    // 增加空文件判断,避免无效操作
    if (file == null || file.Length == 0)
    {
        return false;
    }

    if (!Directory.Exists(path))
    {
        Directory.CreateDirectory(path);
    }

    string fileSavePath = Path.Combine(path, FileNewName);
    // 使用FileStream创建/覆盖目标文件
    using (var fileStream = new FileStream(fileSavePath, FileMode.Create))
    {
        // 等待文件内容异步复制完成
        await file.CopyToAsync(fileStream);
    }
    return true;
}

补充说明

如果不需要异步操作,也可以改用同步方法file.CopyTo(fileStream),此时方法可以保持返回bool类型,无需Task包装。另外增加file.Length == 0的判断,能提前过滤空文件的无效处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:45:59