Подтвердить что ты не робот

Как я могу вернуть pdf файл из веб-запроса в ASP.NET?

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

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

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

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

4b9b3361

Ответ 1

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

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

Response.BinaryWrite(yourPdfAsByteArray);

Response.Flush();

Response.End();

Ответ 2

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

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

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

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

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

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

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