当我将图像 URL 属性设置为 App_Data 文件夹中的 asp 图像控件时,图像显示在页面设计视图中,但不在浏览器中。
<form id="form1" runat="server">
<div>
<asp:Image ID="Image1" runat="server" ImageUrl="~/App_Data/p3.jpg" />
</div>
</form>
它似乎很简单,但它没有显示图像。
该App_Data
文件夹是为数据库文件等数据保留的特殊文件夹,不会渲染网络上的任何内容。这是设计使然,并且是故意的,无法更改(据我所知)。
您的图像绝对不属于App_Data
子文件夹 - 将它们放入/images
文件夹或更合适的位置。
图像永远不应存储在App_Data
文件夹中。这是为永远不应直接提供给用户的文件保留的,例如 .mdb 数据库文件等。
我会在站点的根目录下创建一个/Resources
或文件夹。/Resources/Images
我不同意。在 App_Data 文件夹中隐藏图像并创建自己的 http 处理程序时,您可以保护图像,并且可以在显示图像之前在图像上添加版权文本等。
当我有我不希望每个人都得到的高分辨率图片时,我会这样做,并且让 http-handler 缩小图像并放入一些版权文本。伟大的!
好的,是时候做不可能的事了……虽然您不能直接从 app_data 文件夹加载图像,但您可以编写自己的 http 处理程序,该处理程序将从 app_data 文件夹读取图像文件并将其发送回客户端。这将是一种解决方法,但一般来说,数据适用于只有您的应用程序可以读取的数据。通过让处理程序读取数据,您仍然可以返回这些图像。
但这是不好的做法,如果你为我工作,你会立即被解雇!!!
这取决于!;)
将图像保存在App_Data
. 在您的用户可以上传他们的文件或徽标的情况下,它将保护这些文件,而不是让其他用户可以访问或公开它们。
最重要的是,这是每个服务器/部署实例拥有不同文件的唯一方法。
部署应用程序时,您可以通过在部署配置中启用“从 App_Data 中排除文件”来保护每个服务器实例的用户上传的这些文件。
如果您想通过 url 访问这些文件,请使用下载处理程序,例如 downloadfile.ashx。
希望这可以帮助。
App_Data 文件夹中的内容可以提供,但不能直接提供。
直接访问是不可能的,也不推荐间接访问。这是故意的。
但是添加虚拟路径可以做到这一点。看到这个问题
我认为前三个答案符合您的目的。
将图像存储在全局或本地资源文件夹中,这些也是特殊文件夹,可以通过编程方式访问内容。
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}" />
如果您使用 IIS 管理工具并转到内容过滤(针对您的应用程序),则有一个隐藏段选项卡,您可以在其中删除 App_Data
您会注意到这会添加到“<system.webServer>”节点内的 Web.Config:
<security>
<requestFiltering>
<hiddenSegments>
<remove segment="App_Data" />
</hiddenSegments>
</requestFiltering>
</security>
这样做的一个正当理由是,如果您使用 WebDeploy Publishing 并想要一种简单的方法来设置它以删除目标位置的其他文件,不包括 App_Data 文件夹中的文件(假设您没有将项目中的任何内容发布到 App_Data 并且不在服务器端保持任何私密性)。
将 WebDeploy 配置为在使用 UI 客户端时不删除其他特定文件夹似乎至少有问题(请参阅如何在发布期间跳过删除文件夹?)