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

2

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

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

Теги:
website

3 ответа

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
    Спасибо за пример кода.
  • 0
    Если вы хотите запретить прямой доступ (пользователь, ссылки на другие веб-сайты или поисковая система), я бы использовал вышеописанный метод, но затем обернул его в обработчик (ashx). Затем вы можете проверить источник запроса и соответствующим образом обработать его.
1

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

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

  • 0
    Я в порядке, если они сохранят, снимок экрана или что-нибудь еще после того, как они это увидят. Некоторые PDF-файлы не должны просматриваться некоторыми пользователями. это то, что я пытаюсь предотвратить. Я посмотрю файл .htaccess.
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню