c# .net中如何實現圖片防盜鏈功能的代碼實例

c# .net中如何實現圖片防盜鏈功能的代碼實例
原理一:在asp教程.net中app_data文件夾包含應用程序的本地數據存儲。它一般以文件(諸如microsoft access或microsoft sql server express數據庫教程、xml文件、文本文件以及應用程序支持的任何其餘文件)形式包含數據存儲。該文件夾內容不禁asp.net教程處理,也就是說 瀏覽者沒法直接訪問此文件夾,所以咱們能夠利用這一權限特性來實現防盜鏈。
原理二:對來訪請求地址進行覈查,若是爲非受權地址,剛轉到防盜鏈頁面。
原理三: system.io 命名空間包含容許讀寫文件和數據流的類型以及提供基本文件和目錄支持的類型。其中 filestream 類是對文件系統上的文件進行讀取、寫入、打開和關閉操做,並對其餘與文件相關的操做系統句柄進行操做。filestream 能夠對輸入輸出進行緩衝,從而達到操做大文件的目的。
首先咱們把下載文件與圖片文件放在app_data文件夾中(建議創建子文件夾分別存放)。
在文件getfile.aspx中寫入地址覈查代碼:

    string validstr = "qhdedu.net,qhdedu.com";
           string[] domainname = validstr.tolower().split(new char[] { ',' });
    string referrer = request.urlreferrer.tostring().tolower();
    foreach (string strtmp in domainname)
                {  if (referrer.indexof(strtmp.tolower()) > 0)
                    {
    //此處寫下載代碼
    }
    else
                    { response.redirect("error.htm", true);}//來訪地址不合法,轉向錯誤頁
                    }


其中變量validstr爲容許的訪問來源,若是有多個則用半角的","分割,並將它分割成數組domainname,來訪地址referrer與數組中的各元素進行對比,若是存在,則表示地址合法,若是不存在,視爲地址不合法,剛轉向錯誤頁。
     根據服務器的配置,iis 進程可能會處理數據,也可能會將數據緩存在內存中。若是文件太大,在這兩個進程相互通訊的過程當中,數據將被緩存在內存中。這可能會致使服務器上的內存使用 量急劇增長,因爲web服務器上的內存限制而產生錯誤。所以咱們要將數據分紅多段較小的部分,而後將其移動到輸出流以供下載,從而使用客戶端獲取文件數 據。
如下爲下載文件代碼:
      

    system.io.stream istream = null;
            byte[] buffer = new byte[10000];
            int length;
            long datatoread;
            string filename = system.io.path.getfilename(downfile);
            istream = new system.io.filestream(downfile, system.io.filemode.open, system.io.fileaccess.read, system.io.fileshare.read);
            datatoread = istream.length;
            response.contenttype = "application/octet-stream";
            response.addheader("content-disposition", "attachment; filename=" + filename);
            while (datatoread > 0)
                {if (response.isclientconnected)
                    {length = istream.read(buffer, 0, 10000);
                     response.outputstream.write(buffer, 0, length);
                     response.flush();
                     buffer = new byte[10000];
                     datatoread = datatoread - length;
                    }
                   else
                    {datatoread = -1; }
                }


若是是顯示圖片文件,則可用如下代碼實現:
string filename = server.mappath("app_data" + downfile);
      httpcontext.current.response.contenttype = "image/jpeg";
      httpcontext.current.response.writefile(filename);
其中downfile爲存放於app_data目錄中的圖片文件名稱或下載文件名稱。固然在代碼中開發者能夠本身需求加入適當的設置,如:是否能夠盜鏈,是否產生隨機下載文件名等。
在具體頁面中經過給getfile.aspx傳遞必定參數便可實現下載文件與顯示圖片,如在default.aspx中加入如下代碼:
<a href='<%="getfile.aspx?lb=file&downfile=" + server.urlencode("edu.rar") %>'>測試下載</a>
<img src="<%="getfile.aspx?lb=img&downfile=edulogo.jpg" %>" alt="圖片測試"  />
其中lb表示是下載文件,仍是顯示圖片。
再創建一個錯誤轉向頁error.htm:
<body>
<b style="color:red;">對不起,本站不容許盜鏈</b>
<a href="http://www.3ppt.com" target="_blank" title="IT泡泡堂">返回首頁</a>
</body>web

相關文章
相關標籤/搜索