Отображение файлов PDF на веб-странице из базы данных SQL напрямую, без необходимости сохранять их в файловой системе сервера - PullRequest
3 голосов
/ 13 октября 2011

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

В качестве альтернативы, есть ли способ вызвать метод для удаления файла pdf с сервера, как только пользователь ушел со страницы, которую он просматривает?Как я могу сказать, что пользователь удалился со страницы и как я могу вызвать метод, который удалит файл?

Ответы [ 5 ]

3 голосов
/ 14 октября 2011

Я создал класс MVC с именем PdfResult, который возвращает байтовый массив в виде файла PDF.

Цель заключается в следующем (невозможно загрузить исходный код, извините):

  1. PdfResult наследуется от FileStreamResult
  2. Установить Content-Type заголовок application/pdf
  3. Установите для Content-Disposition значение attachment или inline и укажите соответствующее имя файла
  4. Преобразуйте данные в Stream - есливаши данные представляют собой байтовый массив, а затем запишите его в MemoryStream.

См. https://stackoverflow.com/a/16673120/272072 для хорошего примера того, как это сделать.

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

public ActionResult ShowPdf() {
    // Note: the view should contain a tag like <embed src='MyController/GetPdf'>
    return View(); 
}

public ActionResult GetPdf() {
    byte[] pdfBytes = dataRepo.GetPdf(...);
    return new PdfResult(pdfBytes, "Filename.pdf", false) ;
} 
2 голосов
/ 13 октября 2011

Вот ссылка на статью CodeProject и пример кода под названием Загрузка и выгрузка изображений с SQL Server через ASP.NET MVC .Это дает пример эффективного метода для потоковой передачи контента на и с SQL Server через MVC.

Вы можете легко адаптировать код для потоковой загрузки файлов PDF.

ОБНОВЛЕНИЕ

В статье используется DataReader, но это легкобыть адаптирован к Linq2Sql или EF.Например, вот метод Read, где я читаю из базы данных и копирую в поток:

public override int Read(byte[] buffer, int offset, int count)
{
    result = _attachments.ExecuteStoreQuery<byte[]>(
             "SELECT SUBSTRING(AttachmentBytes, " + position.ToString() +
             ", " + count.ToString() + ") FROM Attachments WHERE Id = {0}",
             id).First();

    var bytesRead = result.Length;
    Buffer.BlockCopy(result, 0, buffer, 0, bytesRead);

    position += bytesRead;
    return (int)bytesRead;
}
1 голос
/ 13 октября 2011

Вы можете прочитать PDF как побочный поток из базы данных и сохранить его в поток ответов http. Если вы правильно установили тип содержимого на application / pdf, браузер загрузит документ в плагин PDF.

Обновление (14 октября 2011 г.) : вам необходимо записать байтовый поток в объект Response.OutputStream. То, как вы создаете и записываете поток байтов, зависит от того, как вы сохранили в базе данных и как вы ее извлекаете. Следующий фрагмент кода взят из статьи на нашем сайте: Создание PDF-форм в ASP.NET с использованием PDFOne .NET v3 .

  // Get the page's output stream ready
  Response.Clear();
  Response.BufferOutput = true;
  // Make the browser display the forms document
  // using a PDF plug-in. (If no plug in is available, 
  // the browser will show the File -> Save As dialog box.
  Response.ContentType = "application/pdf"; 

  // Write the forms document to the browser
  doc.Save(Response.OutputStream);

  doc.Close();
  doc.Dispose();

Объект doc из нашего компонента. Вам не нужно использовать это. Этот фрагмент кода предназначен только для вашего понимания. По вашему требованию вам может понадобиться что-то вроде bytestream.save (Response.OutputStream). Кстати, этот код для обычного ASP.NET, а не MVC.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я работаю на Gnostice.

0 голосов
/ 13 октября 2011

Для первой части вашего вопроса, как упоминалось в комментариях, используйте некоторый тип объекта потока для передачи данных PDF.Прямо сейчас вы передаете файл в локальную файловую систему, а затем передаете его еще раз во встроенный тег для отображения.Просто покончите с промежуточным этапом сохранения в файловой системе и сделайте все это в памяти (хотя это не совсем модель эффективности и может плохо масштабироваться).

Относительно второй частиВаш вопрос, это не так просто.MVC действительно не имеет понятия состояния (viewstate и т. Д.), Поэтому у него нет событий, которые могут быть вызваны изменением состояния (скажем, переходом от страницы).

Вы можете использовать Javascript для обнаружения пользователя, удаляющегося от вашей страницы (windows.onunload), который вызывает (C # / VB) метод для удаления файла из файловой системы.Вероятно, вам придется использовать AJAX для обратной связи с сервером, используя метод HTTP POST, и прослушивать что-либо в конечной точке URL для запуска вашего метода, удаляющего файл.

0 голосов
/ 13 октября 2011

Если вы хотите создать PDF на 100% динамически, вы должны сгенерировать его полностью в памяти, а затем направить его прямо в запрашивающий веб-браузер, не сохраняя его в виде файла.Это очень легко сделать с помощью правильных инструментов.Я бы порекомендовал AspPDF от Persits.com как способ сделать это очень легко.Взгляните на их онлайн-документацию, чтобы увидеть, как это просто сделать, не создавая кучу рендеринга PDF-файлов по всему вашему серверу.

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

...