图像未显示从系统硬盘读取

时间:2014-07-31 05:03:28

标签: asp.net image

图像未显示从系统硬盘读取。

在我的应用程序中,我想在名为attachments的文件夹中读取存储的图像。要运行该应用程序,用户必须在其c盘中创建一个名为attachments的文件夹。 存储的文件的路径如下。 C:\附件\ test.jpg放在。 我想动态读取存储在此文件夹中的图像。我能够从数据库中获取文件的名称。图像不会显示在图像控件中。

我尝试了以下方法:

ImageID. ImageURL= “C:\Attachments\test.jpg”

var url = Server.MapPath("~/Attachments / test.jpg");
  ImageID.ImageUrl = url;

ImageID.ImageUrl = VirtualPathUtility.ToAbsolute("~/Attachments ") + "/test.jpg"

当图像存储在系统磁盘中且文件夹不在Web应用程序路径中时,在图像控件中显示图像的确切方法是什么。

5 个答案:

答案 0 :(得分:5)

  

要运行该应用程序,用户必须在其c盘中创建一个名为附件的文件夹。

此声明有些含糊不清,但希望这意味着安装应用程序的用户必须在与Web应用程序相同的计算机上创建C:\ Attachments文件夹 。如果是这种情况,那么最简单的解决方案是打开IIS管理器,右键单击您的应用程序文件夹并使用以下设置添加虚拟目录:

  • 别名:附件
  • 物理路径: C:\ Attachments

虚拟目录如下所示:

screenshot of IIS

然后,在.aspx页面中,只需将ImageURL控件的Image属性设置为与应用相关的网址:

this.ImageID.ImageUrl = "~/Attachments/test.jpg";

(您不需要自己解析URL。Image控件会将〜解析为相对于当前请求的相应URL,IIS会将浏览器发送的绝对URL映射到C :\ Attachments文件夹。)


但是,如果您想说您网站的每个访问者必须在自己的计算机上创建一个C:\ Attachments文件夹 ,那么您应该重新开始 - 评估您要执行的操作:浏览器安全设置不允许网页访问本地存储在客户端计算机上的资源。

答案 1 :(得分:3)

您需要清楚“网络路径”,“系统硬盘”或“他的C盘”。

就Web开发而言,连接到客户端计算机的磁盘是客户端,连接到Web服务器的磁盘是服务器

如果以上所有内容都与客户端相关,那么只有一种情况可能 - 客户端和服务器都在同一台机器上,并且Web应用程序在IE中被添加为可信站点。在这种情况下,您可以将C:\ Attachments \ test.jpg视为页面的一部分。其他浏览器可能不支持此功能。在所有其他情况下,这是不可能的,也许没有意义。

如果您想在服务器上执行该操作,并且您需要在Web应用程序之外安装该文件夹,那么您可以使用ashx处理程序,您需要从图像中调用

ImageID.ImageURL = “handler.ashx?图像= test.jpg放在”

从那里你可以阅读并输出图像。示例:How to bind a folder of my hard disk on my webpage with datalist?

答案 2 :(得分:2)

尝试修改第二个示例:

<asp:Image ID="Image2" runat="server" />

Image2.ImageUrl = "~\images\test.png"

对我而言,它运作正常。还要小心路径中的空白!

修改

好的,你想在客户端使用文件夹中的图像。你不能这样做。您的代码隐藏在服务器上运行,而不是在客户端上运行。您可以让用户在服务器上上传文件以使用它。这将以这种方式工作:

<asp:FileUpload ID="FileUploadControl" runat="server" />    
<asp:Button runat="server" ID="UploadButton" Text="Upload" OnClick="UploadButton_Click" />

Dim filename As String = Path.GetFileName(FileUploadControl.FileName)
FileUploadControl.SaveAs(Server.MapPath("~/") & filename)

然后使用上面的代码显示图像。 如果您按照上述方式访问客户端,则您访问的任何网页都可以访问您的所有文件。 Web协议不允许您本地窃取客户端计算机的文件。

您必须执行以下操作之一:

  • FileUpload控件,用户选择
  • 安装在客户端上的ActiveX以发送
  • 在客户端上运行的exe发送

答案 3 :(得分:2)

为这些图片提供HttpHandler - 这样您就可以从Web应用程序可以访问的任何文件夹中提供图像(包括某些库中的数据库或嵌入资源)。

假设通用处理程序将命名为ImageHandler.ashx:

public class ImageHandler : IHttpHandler {
  public void ProcessRequest(HttpContext context) {
    const string folder = @"c:\Attachments";
    string fileName = context.Request.QueryString["FileName"];
    var path = Path.Combine(folder, fileName);
    var mapping = new Dictionary<string, string> {
      { ".gif", "image/gif" },
      { ".jpg", "image/jpeg" },
      { ".jpeg", "image/jpeg" },
      { ".png", "image/png" },
      { ".bmp", "image/bmp" }
    };
    var info = new DirectoryInfo(Path.GetDirectoryName(path));
    if (!info.FullName.StartsWith(folder, StringComparison.OrdinalIgnoreCase)) {
      // someone is using .. to hack our path - send him away
      context.Response.StatusCode = 404;
      context.Response.End();
      return;
    }

    if (!File.Exists(path)) {
      // file not found - 404
      context.Response.StatusCode = 404;
      context.Response.End();
      return;
    }

    // set some client caching - you can skip this if you don't want to
    context.Response.Cache.SetCacheability(HttpCacheability.Public);
    context.Response.Cache.SetExpires(DateTime.Now.AddDays(3));

    var extension = Path.GetExtension(path).ToLowerInvariant();
    string contentType;
    if (!mapping.TryGetValue(extension, out contentType)) {
      contentType = "application/octet-stream";
    }
    context.Response.ContentType = contentType;
    context.Response.WriteFile(path);
  }

  public bool IsReusable {
    get { return false; }
  }
}

现在您可以申请

等图片了
<asp:Image ID="Image2" runat="server" 
  ImageUrl="~/ImageHandlers.ashx?FileName=test.png" />

如果你想在服务器端缓存图像(如果你使用的是IIS7),你可以在web配置中设置条目,如:

<location path="ImageHandler.ashx">
  <system.webServer>
    <caching>
      <profiles>
        <add extension=".ashx" policy="CacheForTimePeriod" duration="00:00:10" varyByQueryString="FileName" />
      </profiles>
    </caching>
  </system.webServer>
</location>    

答案 4 :(得分:1)

必须在Web应用程序中创建一个文件夹。

浏览器无法从硬盘上的任意位置访问文件。它只能访问Web服务器提供的文件。这意味着文件必须在您的Web应用程序中。