25

当我将图像 URL 属性设置为 App_Data 文件夹中的 asp 图像控件时,图像显示在页面设计视图中,但不在浏览器中。

<form id="form1" runat="server">
<div>
    <asp:Image ID="Image1" runat="server" ImageUrl="~/App_Data/p3.jpg" />
</div>
</form>

它似乎很简单,但它没有显示图像。

4

8 回答 8

47

App_Data文件夹是为数据库文件等数据保留的特殊文件夹,不会渲染网络上的任何内容。这是设计使然,并且是故意的,无法更改(据我所知)。

您的图像绝对不属于App_Data子文件夹 - 将它们放入/images文件夹或更合适的位置。

于 2009-10-05T12:31:03.247 回答
11

图像永远不应存储在App_Data文件夹中。这是为永远不应直接提供给用户的文件保留的,例如 .mdb 数据库文件等。

我会在站点的根目录下创建一个/Resources或文件夹。/Resources/Images

于 2009-10-05T12:33:07.570 回答
5

我不同意。在 App_Data 文件夹中隐藏图像并创建自己的 http 处理程序时,您可以保护图像,并且可以在显示图像之前在图像上添加版权文本等。

当我有我不希望每个人都得到的高分辨率图片时,我会这样做,并且让 http-handler 缩小图像并放入一些版权文本。伟大的!

于 2010-09-29T20:34:34.793 回答
3

好的,是时候做不可能的事了……虽然您不能直接从 app_data 文件夹加载图像,但您可以编写自己的 http 处理程序,该处理程序将从 app_data 文件夹读取图像文件并将其发送回客户端。这将是一种解决方法,但一般来说,数据适用于只有您的应用程序可以读取的数据。通过让处理程序读取数据,您仍然可以返回这些图像。

但这是不好的做法,如果你为我工作,你会立即被解雇!!!

于 2009-10-05T12:40:25.933 回答
2

这取决于!;)

将图像保存在App_Data. 在您的用户可以上传他们的文件或徽标的情况下,它将保护这些文件,而不是让其他用户可以访问或公开它们。

最重要的是,这是每个服务器/部署实例拥有不同文件的唯一方法。

部署应用程序时,您可以通过在部署配置中启用“从 App_Data 中排除文件”来保护每个服务器实例的用户上传的这些文件。

如果您想通过 url 访问这些文件,请使用下载处理程序,例如 downloadfile.ashx。

希望这可以帮助。

于 2016-07-07T15:16:05.487 回答
1

App_Data 文件夹中的内容可以提供,但不能直接提供。
直接访问是不可能的,也不推荐间接访问。这是故意的。

但是添加虚拟路径可以做到这一点。看到这个问题


我认为前三个答案符合您的目的。
将图像存储在全局或本地资源文件夹中,这些也是特殊文件夹,可以通过编程方式访问内容。

于 2012-12-17T16:42:13.187 回答
0
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}" />
于 2021-01-29T14:43:03.873 回答
0

如果您使用 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 客户端时不删除其他特定文件夹似乎至少有问题(请参阅如何在发布期间跳过删除文件夹?

于 2021-11-16T12:10:03.210 回答