ASP.NET Core Web API部署Windows VPS后图片上传损坏问题
解决思路
1. 修复异步操作未等待的核心问题
代码里用_= image.AttImage.CopyToAsync(filestream);丢弃了异步任务,没等文件写入完成,using块就释放了FileStream,导致文件还没写入就被关闭,这是生成0字节损坏文件的直接原因。
修改代码:
using (var filestream = new FileStream(path, FileMode.Create)) { await image.AttImage.CopyToAsync(filestream); // 添加await等待异步写入完成 }
2. 规范路径拼接方式
当前路径拼接写法有潜在错误,改用Path.Combine多参数重载,避免手动拼接字符串引发的路径分隔符问题:
string path = Path.Combine(wwrootPath, "Pics", $"{RandomString(32)}.jpg");
3. 确认wwrootPath的正确性
确保wwrootPath是通过IWebHostEnvironment.WebRootPath正确获取的wwwroot目录路径。部署到IIS后,检查站点物理路径是否和代码预期一致,避免路径错误导致的写入异常。
4. 完善异常日志排查
当前日志仅记录异常消息和内部异常,无法定位具体错误位置,修改日志代码记录完整堆栈信息:
catch (Exception ex) { Logger.LogError(ex, "图片上传失败"); // 传入Exception对象,自动记录堆栈跟踪 return null; }
5. 检查文件上传大小限制
ASP.NET Core默认限制上传文件大小为30MB,若上传文件超出限制可能导致截断。可在Program.cs中配置放宽限制:
builder.Services.Configure<FormOptions>(options => { options.MultipartBodyLengthLimit = 104857600; // 设置为100MB,按需调整 });
6. 验证上传文件的完整性
在代码中添加日志记录上传文件的原始长度,确认文件内容是否正常到达服务器:
if (image.AttImage == null) return null; Logger.LogInformation($"上传文件原始长度:{image.AttImage.Length}"); // 记录文件长度
内容的提问来源于stack exchange,提问作者Omar
相关产品推荐
相关产品推荐

