2009-08-03 1 views
2

Ich habe eine Website, die eine Reihe von PDFs hat, die vordefiniert sind und auf dem Webserver sitzen.Kann ich ein PDF anzeigen, aber nicht auf einer Website verlinken?

Ich will nicht, damit ein Benutzer nur eine URL eingeben und die PDF-Datei erhalten (dh http://MySite/MyPDFFolder/MyPDF.pdf)

Ich möchte, dass sie nur erlauben, gesehen werden, wenn ich sie ihnen laden und anzeigen.

Ich habe etwas ähnliches schon einmal gemacht. Ich benutzen PDFSharp eine PDF im Speicher zu erstellen und es dann so auf eine Seite laden:

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(); 
    } 


} 

Ich hat versucht, diesen Code zu verwenden, aus einer Datei zu lesen, kann aber nicht herausfinden, wie ein Memorystream erhalten zu lesen in einer Datei.

Ich brauche auch eine Möglichkeit zu sagen, dass der "/ MyPDFFolder" Pfad nicht durchsuchbar ist.

Vielen Dank für alle Anregungen

Antwort

5

Um eine PDF-Datei von der Festplatte in einen Puffer laden:

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

Aber wenn Sie:

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

Dann können Sie Ihre MemoryStream wie folgt erstellen schon haben Sie Ihre Daten im Speicher, Sie brauchen nicht die MemoryStream. Stattdessen tun Sie dies:

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

Danke für den Beispielcode. – Vaccano

+0

Wenn Sie direkten Zugriff verhindern möchten (Benutzer, andere Website-Links oder Suchmaschinen-basiert) würde ich die obige Methode verwenden, aber dann wickeln Sie es in einen Handler (Ashx). Dann können Sie die Quelle der Anfrage überprüfen und sie entsprechend servern. – jaredmroberts

1

Alles, was auf dem Bildschirm des Benutzers angezeigt wird, kann erfasst werden. Sie können Ihre Quelldateien mit einem browserbasierten PDF-Viewer schützen, aber Sie können nicht verhindern, dass der Benutzer Snapshots der Daten erstellt.

So weit wie die Quelldateien sicher zu halten ... wenn Sie sie einfach in einem Verzeichnis speichern, das nicht unter Ihrem Webstamm ist ... sollte das den Trick machen. Oder Sie können eine .htaccess-Datei verwenden, um den Zugriff auf das Verzeichnis einzuschränken.

+0

Mir geht es gut, wenn sie speichern, Screenshot oder was auch immer, nachdem sie es sehen. Einige PDFs sollten von einigen Benutzern nicht angezeigt werden. das versuche ich zu verhindern. Ich werde auf die .htaccess Datei schauen. – Vaccano

0

Der Keltex-Code funktioniert, um zu begrenzen, wer an die Datei gelangen kann. Wenn der Benutzer für eine bestimmte Datei nicht autorisiert ist, geben Sie ihm eine Seite mit einer Fehlermeldung, andernfalls verwenden Sie diesen Code, um die PDF-Datei weiterzuleiten. Die URL wird dann nicht direkt zu einer PDF, sondern zu einem Skript, so dass Sie 100% Kontrolle darüber haben, wer auf sie zugreifen darf.

Anstatt die fraglichen PDFs an einem zugänglichen Ort zu platzieren und mit der Konfiguration zu blödeln, um sie auszublenden, könnten Sie sie an einem Server platzieren, der nicht direkt über das Internet zugänglich ist. Da Sie Code haben, der die Datei in einen Puffer liest und sie trotzdem an den Benutzer weiterleitet, spielt es keine Rolle, wo sich die Datei auf dem Server befindet, solange sie für Ihren Code zugänglich ist.