簡體   English   中英

如何顯示存儲在本地驅動器或網絡驅動器上的圖像?

[英]How to display image which is stored on Local drive or network drive?

我有一個 asp 頁面,我必須在其中顯示存儲在本地磁盤 C: 中的圖像,在某些情況下來自網絡驅動器示例路徑:--C:\\Users\\Public\\Pictures\\Sample Pictures\\Penguins.jpg I在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);

但圖像沒有顯示,所以我偶然發現了這個 SO 問題,我更新了我的代碼如下

對於顯示圖像的頁面

        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 ?

任何幫助都會非常感謝。

圖像不可用,因為該路徑與通過瀏覽器的 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";

1)為什么代理頁面可以訪問物理路徑而其他頁面無法訪問?

其他頁面可以 但是,另一個頁面沒有訪問該文件。 它只是將文件的路徑設置為客戶端(Web 瀏覽器)的 HTML 輸出以訪問它。 結果是這樣:

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

由於用戶無權訪問該文件,因此img標簽將不起作用。 “代理”頁面的目的是從用戶可以訪問的位置提供文件內容,該位置是代理頁面。

2)還有其他方法可以做到嗎?

不。 要么用戶必須通過 Web 服務器上的某個虛擬路徑直接訪問該文件,要么您必須有一個代理來讀取文件的內容並將其發送給用戶。 它與您的 C# 代碼無關,而與用戶可以在 Web 服務器上看到的內容有關。 除非文件位於可通過網絡訪問的文件夾中,否則用戶無法看到它。

這是在 Web 應用程序背后保護文件的一種非常常見和標准的方法。 有時,例如,您希望在允許用戶查看文件之前檢查用戶的授權。 如果該文件可公開訪問,則他們可以直接訪問該文件。 但是如果用戶和文件之間有一個代理頁面,那么該頁面可以強制執行授權。

根據我的經驗,為了避免最終使上述解決方案變得不可能的所有安全問題,最好的方法是設置一個本地網站並像這樣設置圖像網址:image1.ImageUrl="http://pcname/photofolder/ myphoto1.png”。 pcname 是本地 Web 服務器的名稱,路徑是本地 IIS 中設置的虛擬目錄的路徑。 設置本地IIS很簡單,google有很多提示,設置虛擬目錄只需要進入iis,打開默認網站,右鍵“添加新的虛擬目錄”並設置名稱( photofolder 在我的示例中)並使其指向物理本地磁盤文件夾,技巧就完成了。 這也有一個優勢,也就是說您可以在連接到 LAN 的所有客戶端中訪問該文件夾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM