我可以显示PDF,但不允许在网站中链接到它吗?

时间:2009-08-03 17:45:50

标签: c# asp.net web

我的网站上有一堆预先创建并存放在网络服务器上的PDF文件。

我不想让用户只输入网址并获取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”路径是不可浏览的。

感谢您的任何建议

3 个答案:

答案 0 :(得分: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 :(得分:1)

可以捕获用户屏幕上显示的任何内容。您可以使用基于浏览器的PDF查看器保护源文件,但不能阻止用户拍摄数据快照。

至于保持源文件安全...如果你只是将它们存储在不在你的web根目录下的目录中......那应该可以解决问题。或者,您可以使用.htaccess文件来限制对目录的访问。

答案 2 :(得分:0)

Keltex的代码适用于限制谁可以访问该文件。如果用户未获得特定文件的授权,请为其提供包含错误消息的页面,否则请使用该代码将其转发给PDF。然后,该URL不会直接发布到PDF,而是一个脚本,这样您就可以100%控制允许谁访问它。

不是将有问题的PDF放在可访问的位置并且弄乱配置来隐藏它们,而是可以将它们放在不能直接通过Web访问的服务器中。由于您将代码将文件读入缓冲区并将其转发给用户,因此无论文件位于服务器上的哪个位置都无关紧要,只要您的代码可以访问它。

相关问题