IIS托管的ASP.NET MVC5(.NET4.5.2)如何上传读取项目外文件夹图片
实现ASP.NET MVC 5访问项目目录外图片的方案
1. 前置权限配置
- 先确定用于存储图片的外部目录绝对路径,例如
D:\SiteResource\SupplierImages\ - 给该目录添加站点对应IIS应用程序池运行用户的权限,至少开放读取、写入、修改权限,避免读写操作时报权限错误
2. 上传代码修改
首先将外部存储根路径配置到Web.config的appSettings节点,避免硬编码:
<appSettings> <!-- 外部图片存储根路径,可根据环境自行调整 --> <add key="SupplierImageRootPath" value="D:\SiteResource\SupplierImages\" /> </appSettings>
替换原有上传逻辑里的Server.MapPath相关代码,修改后代码如下:
string filename = Path.GetFileName(objdata.image.FileName); // 从配置读取外部存储根路径 string imageRootPath = System.Configuration.ConfigurationManager.AppSettings["SupplierImageRootPath"]; string imagepath = Path.Combine(imageRootPath, filename); if (System.IO.File.Exists(imagepath)) { System.IO.File.Delete(imagepath); } objdata.image.SaveAs(imagepath);
3. 图片读取实现
外部目录不在站点根目录范围内,无法直接通过站点URL访问,可选择以下两种方案实现读取:
方案A:IIS添加虚拟目录(无权限控制需求推荐)
- 打开IIS管理器,找到对应站点,右键选择「添加虚拟目录」
- 别名设置为
SupplierImages,物理路径选择你的外部图片存储目录,确认配置 - 给虚拟目录绑定和站点相同的应用程序池,验证权限无误后,即可直接通过
{站点域名}/SupplierImages/{文件名}访问图片
方案B:控制器Action代理读取(需要权限控制推荐)
在对应控制器中新增读取图片的Action,可在返回前做权限校验、水印添加等自定义逻辑:
public ActionResult GetSupplierImage(string filename) { string imageRootPath = System.Configuration.ConfigurationManager.AppSettings["SupplierImageRootPath"]; string fullPath = Path.Combine(imageRootPath, filename); if (!System.IO.File.Exists(fullPath)) { return HttpNotFound(); } // 自动获取图片MIME类型 string mimeType = MimeMapping.GetMimeMapping(fullPath); return File(fullPath, mimeType); }
前端访问路径格式为/{控制器名}/GetSupplierImage?filename={图片文件名}
注意:生产环境部署时如果选择虚拟目录方案,要确认站点重新发布不会覆盖虚拟目录配置;文件名建议增加随机前缀避免重名覆盖。
内容的提问来源于stack exchange,提问作者user16573226
相关产品推荐
相关产品推荐

