Вывод двоичных данных в формате PDF в .NET - PullRequest
2 голосов
/ 13 июля 2011

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

http://myhost.com/FileManager.aspx?FileId=8465b2f9-b64e-4a9a-a449-94b5adb3b278

Итак, из того, что я мог сделать вывод, для браузера это загружаемая страница ASPX, а не PDF. Firefox и IE правильно интерпретируют это и запускают Adobe Acrobat, однако, поскольку Chrome (12.0.742.112) имеет собственную реализацию программы чтения PDF, он откроет файл правильно, но затем, когда кто-то собирается сохранить файл в Chrome, он хочет сохраните его в формате .aspx. Если я просто переименую .aspx в .pdf, файл загрузится правильно. Однако я стараюсь не говорить своему клиенту, что ему / ей, возможно, придется сделать этот дополнительный шаг.

Когда я решил посмотреть заголовки, загруженные в Chrome через Web Inspector, я увидел это:

FileManager.aspx: -1 Ресурс интерпретируется как Документ, но перенесен с приложением типа MIME / pdf

Я полностью понимаю, почему Chrome так сказал.

Кроме того, я получаю сохранение как поле при загрузке страницы, когда добавляю:

Response.AddHeader("content-disposition", "attachment;filename=blah.pdf");

Однако я надеялся просто сохранить файл в браузере. Итак, кроме использования перезаписи URL-адреса, есть ли способ манипулировать заголовками HTTP, чтобы просто открыть страницу в формате PDF и правильно сохранить ее в Chrome?

Наконец, я попытался использовать WebService, но я не могу записать двоичные данные на страницу.

this.Context.Response.BinaryWrite(bytes);

Любая помощь приветствуется!

Ответы [ 2 ]

4 голосов
/ 13 июля 2011

В веб-приложении верхнего уровня web.config добавьте следующий элемент <add> в раздел <httpHandlers>:

<httpHandlers>
    <add verb="*" path="FileManager.pdf" type="ProjectName.FileManager" />

... где ProjectName.FileManager - полное имя (пространство имени имя класса) FileManager класса в FileManager.aspx.cs.

Это указывает ASP.NET обрабатывать путь /FileManager.pdf с помощью обработчика, определенного ProjectName.FileManager.(System.Web.UI.Page реализует интерфейс IHttpHandler, поэтому каждая веб-форма является обработчиком.)

Теперь вы можете обслуживать PDF-файлы по URL-адресу с расширением .pdf , например:

http://myhost.com/FileManager.pdf?FileId=8465b2f9-b64e-4a9a-a449-94b5adb3b278

Вы не должны переименовать физический файл FileManager.aspx.Когда пользователь вводит /FileManager.pdf?FileId=foo в браузере, ASP.NET обрабатывает запрос с помощью класса ProjectName.FileManager, определенного в FileManager. aspx .

Примечание:

Вышеуказанное должно работать на Cassini (мини-веб-сервер Visual Studio) без дальнейших изменений.Однако IIS по умолчанию отправляет только запросы * .aspx, * .asmx, * .ashx в ASP.NET.Поэтому, чтобы вышесказанное работало на IIS, необходимо указать ему отправлять запросы на /FileManager.pdf в ASP.NET.То есть вам необходимо настроить «отображение».

В IIS 6 необходимо настроить сопоставление с помощью диспетчера IIS .

В IIS 7 вы можете настроить сопоставление из файла web.config - это облегчает развертывание, но зависит от того, как настроен ваш хостинг.

2 голосов
/ 13 июля 2011

Что-то, что мне помогло, - это добавление предполагаемого имени файла между именем страницы приложения (в вашем случае FileManager.aspx) и меткой запроса (метка ?).

Итак, в итоге у вас будет что-то вроде этого:

http://myhost.com/FileManager.aspx/myfile.pdf?FileId=8465b2f9-b64e-4a9a-a449-94b5adb3b278

Удивительно, но правильное приложение будет запущено (Filemanager.aspx), переменные будут переданы целыми и невредимыми (FileId), результат будет обработан как inline (если вы не изменили его на attachment, это так) но браузер будет думать, что имя файла, которое нужно использовать, в случае, если пользователь хочет сохранить страницу, - myfile.pdf.

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