我的网站上有一堆预先创建并存放在网络服务器上的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”路径是不可浏览的。
感谢您的任何建议
答案 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访问的服务器中。由于您将代码将文件读入缓冲区并将其转发给用户,因此无论文件位于服务器上的哪个位置都无关紧要,只要您的代码可以访问它。