远程服务器抛出System.IO.DirectoryNotFoundException错误求助
解决Umbraco部署后读取Excel中图片路径报错的问题
首先咱们得揪出这个错误的核心原因:你本地测试时,Excel里的图片路径是自己电脑上的绝对路径(比如C:\Users\gwphi_000\Desktop\test\OrderEmail.png),但部署到远程服务器后,服务器根本没有这个路径的文件——就算凑巧路径存在,应用池的Network Services账户也大概率没权限访问你本地的桌面目录,这就直接触发了找不到路径的异常。
下面给你一步步的解决方案:
1. 修正Excel中的图片路径逻辑
别再让Excel里存本地绝对路径了,这在服务器上完全行不通。你可以改成两种更合理的方式:
- 让用户上传Excel的同时,把所有关联的图片文件也上传到服务器的指定目录(比如网站根目录下的
uploads/images),然后Excel里只填图片文件名或者相对服务器目录的路径。 - 如果必须用路径,就用服务器上的相对路径,比如
/uploads/images/OrderEmail.png,而不是本地的C盘路径。
2. 调整代码中的路径处理逻辑
你原来的代码直接用Path.GetFullPath(item.ProductUrl)读取本地路径,这在服务器上肯定找不到文件。改成用服务器端的根目录来拼接正确路径:
如果你用的是ASP.NET Core + Umbraco
先注入IWebHostEnvironment来获取网站根目录,然后拼接服务器路径:
// 注入的IWebHostEnvironment实例 private readonly IWebHostEnvironment _webHostEnv; // 读取图片时的代码 var serverImageDir = Path.Combine(_webHostEnv.WebRootPath, "uploads", "images"); var fullServerPath = Path.Combine(serverImageDir, item.ProductUrl); // 先检查文件是否存在,避免直接报错 if (!File.Exists(fullServerPath)) { // 这里可以加日志记录或者跳过当前项,比如: _logger.LogWarning("图片文件不存在:{Path}", fullServerPath); continue; } // 再读取文件内容 byte[] buffer = File.ReadAllBytes(fullServerPath); MemoryStream strm = new MemoryStream(buffer); // 后续创建Umbraco媒体的代码保持不变...
如果你用的是旧版Umbraco(.NET Framework)
可以用Server.MapPath来获取服务器路径:
var serverImageDir = Server.MapPath("~/uploads/images"); var fullServerPath = Path.Combine(serverImageDir, item.ProductUrl);
3. 确保服务器权限配置正确
即使路径对了,Network Services账户也得有读取图片目录的权限:
- 找到服务器上的图片存储目录(比如
C:\inetpub\wwwroot\你的站点名\uploads\images)。 - 右键目录 → 权限 → 添加Network Services账户,给它读取和执行、列出文件夹内容、读取的权限。
4. 额外的错误处理建议
在代码里加一些异常捕获,避免单个图片文件的问题导致整个Excel处理失败:
foreach (var item in excelList) { try { // 你的原有代码(已经修改路径处理后的) } catch (Exception ex) { // 记录错误日志,方便排查问题 _logger.LogError(ex, "处理商品{ProductName}时出错", item.Product); // 选择跳过当前项继续处理,避免全部失败 continue; } }
这样调整后,应该就能解决部署到服务器后的路径找不到问题了。
内容的提问来源于stack exchange,提问作者George Phillipson
相关产品推荐
相关产品推荐

