指定路径文件未上传: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
相关产品推荐
相关产品推荐

