Могу ли я отображать PDF, но не разрешать ссылки на него на веб-сайте? - PullRequest
2 голосов
/ 03 августа 2009

У меня есть веб-сайт, на котором есть несколько 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" не доступен для просмотра.

Спасибо за любые предложения

Ответы [ 3 ]

5 голосов
/ 03 августа 2009

Чтобы загрузить файл 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 голос
/ 03 августа 2009

Все, что отображается на экране пользователя, может быть захвачено. Вы можете защитить свои исходные файлы с помощью обозревателя PDF на основе браузера, но не можете запретить пользователю делать снимки данных.

Что касается обеспечения безопасности исходных файлов ... если вы просто храните их в каталоге, который не находится в вашем веб-корне ... это должно сработать. Или вы можете использовать файл .htaccess, чтобы ограничить доступ к каталогу.

0 голосов
/ 03 августа 2009

Код Keltex работает для ограничения того, кто может получить доступ к файлу. Если пользователь не авторизован для определенного файла, предоставьте ему страницу с сообщением об ошибке, в противном случае используйте этот код для передачи ему PDF. Тогда URL будет не напрямую к PDF, а скорее сценарием, так что вы получите 100% контроль над тем, кому разрешен доступ к нему.

Вместо того, чтобы помещать рассматриваемые PDF-файлы в доступное место и связываться с конфигурацией, чтобы скрыть их, вы можете поместить их где-нибудь на сервере, который не доступен напрямую через Интернет. Поскольку у вас будет код, считывающий файл в буфер и в любом случае передающий его пользователю, не имеет значения, где на сервере расположен файл, если он доступен для вашего кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...