Как я могу вернуть PDF из веб-запроса в ASP.NET? - PullRequest
22 голосов
/ 13 января 2010

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

Мы могли бы сгенерировать ссылку на страницу aspx, заставить эту страницу сгенерировать pdf, сохранить pdf в файловую систему и затем Response.Redirect на сохраненный pdf. Тогда нам нужно было как-то отслеживать и очищать PDF-файл.

Так как нам никогда не нужно хранить эти данные, я хотел бы вместо этого, если возможно, сделать так, чтобы страница aspx генерировала pdf-файл и передавала его обратно в качестве ответа на исходный запрос. Это возможно?

(В нашем случае мы используем C # и хотим вернуть файл в формате pdf, но похоже, что любое решение, вероятно, будет работать для различных языков .NET и возвращаемых типов файлов.)

Ответы [ 2 ]

38 голосов
/ 13 января 2010

При условии, что вы можете получить byte[], представляющий ваш PDF:

Response.Clear();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition",
    "attachment;filename=\"FileName.pdf\"");

Response.BinaryWrite(yourPdfAsByteArray);

Response.Flush();

Response.End();
2 голосов
/ 13 января 2010

Посмотрите, как работает HTTP. Клиент (= браузер) не полагается на расширения, он только хочет, чтобы сервер возвращал некоторые метаданные вместе с документом.

Метаданные могут быть добавлены с помощью Response.AddHeader, и одна «строка метаданных» состоит из имени и значения.

Content-Type - это свойство, которое вас интересует, а значением является MIME-тип данных (исследование: RFC1945 для HTTP-заголовков, google для MIME-типа).

Для порядковых страниц aspx (html, ....) это свойство text / html (не так тривиально, но для этого примера этого достаточно). Если вы возвращаете JPG-изображение, оно может иметь имя «image.gif», но если вы отправляете «image / jpeg» в Content-Type, оно обрабатывается как JPG-изображение. Тип содержимого для pdf - «application / pdf».

Браузер будет работать в соответствии с поведением по умолчанию, например, с плагином Adobe, он отобразит PDF в своем окне, если у вас нет плагина для PDF, он должен загрузить файл и т. Д.

В заголовке Content-Disposition указано, что вы должны делать с данными. Если вы хотите, чтобы клиент явно «загружал» некоторые HTML / PDF / что-либо еще и не отображал их по умолчанию, вам нужно значение «attachment». Он должен иметь другой параметр (как предложено Джастином Нисснером), который используется в случае чего-то вроде:

http://server/download.aspx?file=11 -> Content-Disposition: attachment; filename = file.jpg говорит, как файл должен иметь имя по умолчанию.

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