如何显示存储在本地驱动器或网络驱动器上的图像?

时间:2013-10-09 13:01:59

标签: c# asp.net image web-applications

我有一个asp页面,其中我必须显示存储在我的本地磁盘C中的图像:在某些情况下来自网络驱动器 示例路径: - C:\ Users \ Public \ Pictures \ Sample Pictures \ Penguins.jpg  我在c#代码后面做了以下代码

Image image = new Image();
image.Height = 150;
image.Width = 150;
string path = @"C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg";//this path will come from database dynamically this is for test only
image.ImageUrl = path;
this.Controls.Add(image);

但图片没有显示,所以我偶然发现了this SO Question,我更新了我的代码,如下所示

显示图像的页面

        Image image = new Image();
        image.Height = 150;
        image.Width = 150;
        string path = @"C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg";
        image.ImageUrl = "ImageWriter.aspx?path=" + path;
        this.Controls.Add(image);

和代理页面

        Response.ContentType = "image/jpeg"; // for JPEG file
        string physicalFileName = Request.QueryString["path"];
        Response.WriteFile(physicalFileName);

这工作正常,但我有两个问题

 1) Why the file is accessible from the physical path while proxy from page but other page cannot able to access it ? 
 2) And is there any other way to do it ?

任何帮助都会非常感谢。

3 个答案:

答案 0 :(得分:3)

图像不可用,因为该路径通过可能位于另一台PC和网络上的浏览器与asp.net站点用户没有相关上下文。要解决此问题,您需要做的就是创建一个ASHX处理程序页面,该页面可以获取服务器本地驱动器或网络上的图像,并将它们作为图像提供给浏览器:

    public void ProcessRequest(HttpContext context)
    {
        string imgName = context.Request.QueryString["n"];
        context.Response.ContentType = "image/png";
        string path = @"C:\Users\Public\Pictures\Sample Pictures\" + imgName;
        Image image = Image.FromFile(path);
        image.Save(context.Response.OutputStream, ImageFormat.Png);
    }

然后在你的asp中点一个图片网址到ashx:

    image.src = "images.ashx?n=penguin.jpg";

答案 1 :(得分:2)

  

1)为什么代理页面可以访问物理路径但其他页面无法访问它?

另一页可以。但是,其他页面访问该文件。它只是将文件的路径设置为客户端(Web浏览器)的HTML输出来访问它。结果如下:

<img src = "C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg" />

由于用户无权访问该文件,因此img代码无效。 “代理”页面的目的是从用户可以访问的位置提供文件内容,该位置是代理页面。

  

2)还有其他办法吗?

不。用户必须通过Web服务器上的某个虚拟路径直接访问该文件,或者您必须拥有一个读取文件内容并将其发送给用户的代理。它与您的C#代码几乎没有关系,也与用户在Web服务器上可以看到的内容有关。除非文件位于可通过Web访问的文件夹中,否则用户无法看到它。

这是保护Web应用程序后面的文件的一种非常常见且标准的方法。例如,有时您希望在允许用户查看文件之前检查用户的授权。如果该文件可公开访问,他们可以直接访问它。但是,如果用户和文件之间存在代理页面,则该页面可以强制执行授权。

答案 2 :(得分:1)

根据我的经验,最好的办法,就是为了避免上述解决方案最终使所有安全问题无法解决的问题,就是设置一个本地网站并设置如下图像网址:image1.ImageUrl =&#34; http: //pcname/photofolder/myphoto1.png" ;. pcname是本地Web服务器的名称,路径是本地IIS中设置的虚拟目录的路径。设置本地IIS非常简单,google有很多提示,而设置虚拟目录只需要输入iis,打开默认网站,右键单击&#34;添加新的虚拟目录&#34;并设置名称(在我的示例中为photofolder)并使其指向物理本地磁盘文件夹并完成诀窍。这也有一个优势,即可以在连接到局域网的所有客户端中访问该文件夹。

相关问题