2009-08-03 36 views
2

我有一個網站,有一堆的預先創建和坐在網絡服務器上的PDF。我可以顯示PDF,但不允許在網站中鏈接它嗎?

我不想讓用戶只需鍵入URL,並獲得PDF文件(即http://MySite/MyPDFFolder/MyPDF.pdf

我只想讓我的時候加載它們,並顯示他們他們觀看。

我以前做過類似的事情。我用PDFSharp在內存中創建一個PDF,然後將其加載到這樣的頁面:

protected void Page_Load(object sender, EventArgs e) 
{ 
    try 
    { 
     MemoryStream streamDoc = BarcodeReport.GetPDFReport(ID, false); 
     // Set the ContentType to pdf, add a header for the length 
     // and write the contents of the memorystream to the response 
     Response.ContentType = "application/pdf"; 
     Response.AddHeader("content-length", Convert.ToString(streamDoc.Length)); 
     Response.BinaryWrite(streamDoc.ToArray()); 
     //End the response 
     Response.End(); 
     streamDoc.Close(); 
    } 
    catch (NullReferenceException) 
    { 
     Communication.Logout(); 
    } 


} 

我試圖用這個代碼從文件中讀取,但無法弄清楚如何讓一個MemoryStream閱讀在一個文件中。

我還需要一種方式來說「/ MyPDFFolder」路徑是不可瀏覽的。

感謝您的任何建議

回答

5

要從磁盤上的PDF文件加載到緩衝區:

byte [] buffer; 
using(FileStream fileStream = new FileStream(Filename, FileMode.Open)) 
{ 
    using (BinaryReader reader = new BinaryReader(fileStream)) 
    { 
     buffer = reader.ReadBytes((int)reader.BaseStream.Length); 
    } 
} 

然後你就可以創建你MemoryStream這樣的:

using (MemoryStream msReader = new MemoryStream(buffer, false)) 
{ 
    // your code here. 
} 

但是,如果你已經有你的數據在內存中,你不需要MemoryStream。可以這樣做:

Response.ContentType = "application/pdf"; 
    Response.AddHeader("Content-Length", buffer.Length.ToString()); 
    Response.BinaryWrite(buffer); 
    //End the response 
    Response.End(); 
    streamDoc.Close(); 
+1

感謝您的示例代碼。 – Vaccano 2009-08-03 18:05:20

+0

如果要防止直接訪問(用戶,其他網站鏈接或基於搜索引擎),我會使用上述方法,但將其包裝在處理程序(ashx)中。然後,您可以驗證請求的來源並相應地將其提供出來。 – jaredmroberts 2009-08-03 18:38:25

1

任何顯示在用戶屏幕上的內容都可以被捕獲。您可以使用基於瀏覽器的PDF查看器來保護源文件,但不能阻止用戶拍攝數據快照。

至於保持源文件的安全......如果你只是將它們存儲在一個不在你的web根目錄下的目錄中......應該這樣做。或者您可以使用.htaccess文件來限制對目錄的訪問。

0

Keltex的代碼用於限制誰可以訪問該文件。如果用戶未獲得特定文件的授權,請爲他們提供一個帶有錯誤信息的頁面,否則使用該代碼將PDF轉發給他們。然後URL不會直接轉爲PDF,而是一個腳本,這樣可以讓您100%控制允許誰訪問它。

與其將有問題的PDF放在可訪問的位置並且隱藏配置來隱藏它們,您可以將它們放在不直接可以訪問的服務器中的某個位置。由於您將代碼讀取文件到緩衝區並將其轉發給用戶,無論文件位於服務器上的哪個位置,只要您的代碼可以訪問它即可。

相關問題