2009-08-03 3 views
2

J'ai un site Web qui contient un ensemble de fichiers PDF pré-créés et installés sur le serveur Web.Puis-je afficher un fichier PDF, mais ne pas autoriser l'insertion de liens dans un site Web?

Je ne veux pas permettre à un utilisateur de taper simplement dans une URL et obtenir le fichier PDF (c.-à-http://MySite/MyPDFFolder/MyPDF.pdf)

Je veux leur permettre que d'être vus quand je les charge et les afficher.

J'ai déjà fait quelque chose de similaire. Je PdfSharp pour créer un fichier PDF dans la mémoire, puis le charger sur une page comme celle-ci:

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


} 

J'ai essayé d'utiliser ce code pour lire un fichier, mais ne pouvait pas comprendre comment obtenir un MemoryStream pour lire dans un fichier.

J'ai également besoin d'un moyen de dire que le chemin "/ MyPDFFolder" est non-navigable.

Merci pour toutes suggestions

Répondre

5

Pour charger un fichier PDF à partir du disque dans un tampon:

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

Ensuite, vous pouvez créer votre MemoryStream comme ceci:

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

Mais si vous avez déjà vos données en mémoire, vous n'avez pas besoin de MemoryStream. Au lieu de cela, faites ceci:

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

Merci pour l'exemple de code. – Vaccano

+0

Si vous voulez empêcher l'accès direct (Utilisateur, Autres liens de site Web ou Basé sur un moteur de recherche), j'utiliserais la méthode ci-dessus mais ensuite je l'emballerais dans un gestionnaire (ashx). Ensuite, vous pouvez vérifier la source de la requête et la sortir en conséquence. – jaredmroberts

1

Tout ce qui est affiché sur l'écran de l'utilisateur peut être capturé. Vous pouvez protéger vos fichiers source en utilisant un visualiseur PDF basé sur un navigateur, mais vous ne pouvez pas empêcher l'utilisateur de prendre des instantanés des données.

En ce qui concerne la sécurité des fichiers sources ... si vous les stockez simplement dans un répertoire qui n'est pas sous votre racine web ... cela devrait faire l'affaire. Ou vous pouvez utiliser un fichier .htaccess pour restreindre l'accès au répertoire.

+0

Je vais bien s'ils économisent, une capture d'écran ou quoi que ce soit après qu'ils l'ont vue. Certains fichiers PDF ne doivent pas être affichés par certains utilisateurs. c'est ce que j'essaie d'empêcher. Je vais regarder le fichier .htaccess. – Vaccano

0

Le code de Keltex fonctionne pour limiter qui peut accéder au fichier. Si l'utilisateur n'est pas autorisé pour un fichier particulier, donnez-lui une page avec un message d'erreur, sinon utilisez ce code pour le relayer. L'URL ne sera alors pas directement sur un PDF, mais plutôt sur un script, ce qui vous permettra de contrôler à 100% qui est autorisé à y accéder. Plutôt que de mettre les fichiers PDF en question dans un endroit accessible et de jouer avec la configuration pour les cacher, vous pouvez les placer quelque part dans le serveur qui n'est pas directement accessible sur le Web. Puisque vous aurez du code lisant le fichier dans un tampon et le relayant de toute façon à l'utilisateur, peu importe où se trouve le fichier sur le serveur, tant qu'il est accessible à votre code.

Questions connexes