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

C# 如何显示存储在本地驱动器或网络驱动器上的图像?,c#,asp.net,image,web-applications,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 Pic

我有一个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);
但图像并没有显示出来,所以我偶然发现了,我更新了我的代码如下

用于显示图像的页面

        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 ?
任何帮助都很好,谢谢

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

另一页可以。但是,另一个页面没有访问该文件。它只是将文件的路径设置为HTML输出,以便客户端(web浏览器)访问它。因此:

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

由于用户没有访问该文件的权限,
img
标记将不起作用。“代理”页面的目的是从用户可以访问的位置提供文件内容,该位置是代理页面

2) 还有别的办法吗

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


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

图像不可用,因为该路径与asp.net站点用户没有相关上下文,而该用户可能位于另一台PC和网络上。要解决此问题,您只需创建一个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中,只需将图像url指向ashx:

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

根据我的经验,最好的方法是建立一个本地网站,并像这样设置图像url:image1.ImageUrl=”,以避免最终导致上述解决方案无法实现的所有安全问题http://pcname/photofolder/myphoto1.png".
pcname是本地web服务器的名称,路径是本地IIS中设置的虚拟目录的路径。设置本地IIS非常简单,google有很多提示,而设置虚拟目录只需要进入IIS,打开默认网站,右键点击“添加一个新的虚拟目录”,设置名称(在我的示例中为photofolder),并将其指向一个物理本地磁盘文件夹,技巧就完成了。这还有一个优势,那就是你可以在连接到局域网的所有客户端中访问该文件夹。

谢谢,我想我知道了。你可能想限制
ImageWriter.aspx
可以处理的文件范围:你现在可以打开访问Web服务器上“IIS用户”可以读取的任何文件。是的,但我可以强制用户进行身份验证,因为@David saidI将您的ProcessRequest添加到名为images.ashx的文件中,这对我来说非常有效。我还添加了一个try-catch。非常感谢。