App_Data 文件夹中的图像未在浏览器中显示
Posted
技术标签:
【中文标题】App_Data 文件夹中的图像未在浏览器中显示【英文标题】:Images that are in App_Data folder not shown in browser 【发布时间】:2010-12-03 22:28:57 【问题描述】:当我将图像 URL 属性设置为 App_Data 文件夹中的 asp 图像控件时,图像显示在页面设计视图中,但不在浏览器中。
<form id="form1" runat="server">
<div>
<asp:Image ID="Image1" runat="server" ImageUrl="~/App_Data/p3.jpg" />
</div>
</form>
看起来很简单,但它没有显示图像。
【问题讨论】:
【参考方案1】:App_Data
文件夹是为数据库文件等数据保留的特殊文件夹,并且不会呈现网络上的任何内容。这是设计使然,是故意的,无法更改(据我所知)。
您的图像绝对不属于 App_Data
子文件夹 - 将它们放入 /images
文件夹或更合适的文件夹中。
【讨论】:
【参考方案2】:图像不应存储在App_Data
文件夹中。这是为永远不应直接提供给用户的文件保留的,例如 .mdb 数据库文件等。
我会在站点根目录下创建一个/Resources
或/Resources/Images
文件夹。
【讨论】:
大家好,但问题是当我尝试在根目录中创建“/Resources/Images”文件夹时,我收到拒绝访问错误。(当网站托管在 IIS 中时)。什么是为 IIS 用户帐户在根目录中创建目录而不授予用户帐户对整个根目录的权限的最佳方法?有可能吗?当我尝试在根目录中创建目录时出现访问被拒绝错误。 【参考方案3】:我不同意。在 App_Data 文件夹中隐藏图像并创建自己的 http 处理程序时,您可以保护图像并在显示图像之前在图像上添加版权文本等。
当我有高分辨率图片时我会这样做,我不希望每个人都得到,并且让 http-handler 缩小图像并放入一些版权文本。太好了!
【讨论】:
【参考方案4】:好的,是时候做不可能的事了...虽然您不能直接从 app_data 文件夹加载图像,但您可以编写自己的 http 处理程序,该处理程序将从 app_data 文件夹中读取图像文件并将其发送回客户端。这将是一种解决方法,但一般来说,数据适用于只有您的应用程序可以读取的数据。通过让处理程序读取数据,您仍然可以返回这些图像。
但这是不好的做法,如果你为我工作,你会立即被解雇!!!
【讨论】:
即使考虑如何绕过 asp.net 以允许从 app_data 提供图像也是一个坏主意... @Chris,我同意!我会自己开火! ;-) +1 分享这个想法,即使这是不好的做法。有时这是学习如何做正确事情的方法,因为它有助于理解可以做什么。【参考方案5】:这取决于! ;)
将图像保存在App_Data
中是有充分理由的。在您的用户可以上传他们的文件或徽标的情况下,它将保护这些文件,并且不会让其他用户访问或公开它们。
最重要的是,这是每个服务器/部署实例拥有不同文件的唯一方法。
在部署您的应用时,您可以通过在部署配置中启用“从 App_Data 中排除文件”来保护每个服务器实例的用户上传的这些文件。
如果您想通过 url 访问这些文件,请使用下载处理程序,例如 downloadfile.ashx。
希望这会有所帮助。
【讨论】:
【参考方案6】:可以提供 App_Data 文件夹中的内容,但不能直接提供。无法直接访问,不建议使用间接访问。这是故意的。
但是添加虚拟路径可以做到这一点。 看到这个question
我认为前三个答案符合您的目的。 将图像存储在全局或本地资源文件夹中,这些也是特殊文件夹,可以通过编程方式访问内容。
【讨论】:
【参考方案7】:public string ReturnImage()
alternatively if you wanted to pass a param.
so for example
int WhatEverId = 5;
String folderPath = string.empty;
HostingEnvironment.MapPath("~/App_Data/YourFolder") + @"\" +WhatEverId.ToString());
string imageYouWantToDisplay = "Test.png";
string base64String = "";
String path = HostingEnvironment.MapPath("~/App_Data");
using (Image image = Image.FromFile(path + "/" + imageYouWantToDisplay))
using (MemoryStream m = new MemoryStream())
image.Save(m, image.RawFormat);
byte[] imageBytes = m.ToArray();
// Convert byte[] to Base64 String
base64String = Convert.ToBase64String(imageBytes);
return base64String;
然后您可以在操作方法中调用它
public DisplayImages ()
List<WhateverModel> test = new List<WhateverModel>();
test = GetAll().ToList();
test.ForEach(x=> MyImage = ReturnImage(););
return test;
查看
@model WhateverModel
<img src="@MyImage" /> or in js <img src="$MyImage" />
【讨论】:
【参考方案8】:如果您使用 IIS 管理工具并转到内容过滤(针对您的应用程序),则有一个 Hidden Segments 选项卡,您可以在其中删除 App_Data
您会注意到这会添加到“
<security>
<requestFiltering>
<hiddenSegments>
<remove segment="App_Data" />
</hiddenSegments>
</requestFiltering>
</security>
这样做的一个正当理由是,如果您使用 WebDeploy Publishing 并想要一种简单的方法来设置它以删除目标位置的其他文件,不包括 App_Data 文件夹中的文件(假设您没有将项目中的任何内容发布到 App_Data 和不要在服务器端保留任何隐私)。
将 WebDeploy 配置为在使用 UI 客户端时不删除其他特定文件夹似乎至少有问题(请参阅How to skip delete on folder during publish?)
【讨论】:
以上是关于App_Data 文件夹中的图像未在浏览器中显示的主要内容,如果未能解决你的问题,请参考以下文章