【问题标题】:Image not displayed read from the system hard disk从系统硬盘读取的图像不显示
【发布时间】:2014-07-31 05:03:28
【问题描述】:

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

在我的应用程序中,我想读取存储在名为附件的文件夹中的图像。要运行该应用程序,用户必须在他的 c 驱动器中创建一个名为附件的文件夹。 存储文件的路径如下。 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应用程序路径中时,在图像控件中显示图像的确切方式是什么。

【问题讨论】:

    标签: asp.net image


    【解决方案1】:

    要运行应用程序,用户必须在他的 c 驱动器中创建一个名为附件的文件夹。

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

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

    虚拟目录将如下所示:

    然后,在您的 .aspx 页面中,只需将您的 Image 控件的 ImageURL 属性设置为应用相对 URL:

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

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


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

    【讨论】:

      【解决方案2】:

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

      在Web开发方面,连接到客户端计算机的磁盘是客户端,连接到Web服务器的磁盘是服务器

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

      如果您想在 服务器 上执行此操作,并且您需要在 Web 应用程序之外拥有该文件夹,那么您可以拥有一个 ashx-handler,您需要从您的图像中调用它 p>

      ImageID.ImageURL="handler.ashx?image=test.jpg"

      以及您可以从哪里读取和输出图像。示例:How to bind a folder of my hard disk on my webpage with datalist?

      【讨论】:

        【解决方案3】:

        尝试像这样修改您的第二个示例:

        <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文件

        【讨论】:

        • 如果在网络路径下创建一个文件夹,此方法有效....但我不想在网络路径下添加我的图像文件夹
        • 我认为在这种情况下,您必须首先为文件夹创建一个虚拟目录。也许这可以帮助你:msdn.microsoft.com/en-us/library/zwk103ab(v=vs.90).aspx
        【解决方案4】:

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

        假设通用处理程序将被命名为 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>    
        

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2015-03-22
            • 1970-01-01
            • 2012-07-09
            • 1970-01-01
            • 1970-01-01
            • 2015-04-23
            • 2018-03-11
            • 2010-10-31
            • 2012-05-15
            相关资源
            最近更新 更多