PDF скачать со страницы aspx - PullRequest
4 голосов
/ 12 ноября 2010

У меня есть страница, на которой, когда пользователь нажимает кнопку, динамически генерируется PDF-файл и предлагается его загрузить.

Это код, который позволяет пользователю скачать pdf:

// Omitted code that generates the pdf bytes

response.ContentType = "application/octetstream";
response.AppendHeader("Content-Disposition", "attachment; filename=" + filename);
response.BinaryWrite(pdfBytes);
response.End();

На моей машине и многих других, использующих смесь Chrome, IE 7/8 / 9b и Firefox, это работает должным образом; пользователь нажимает кнопку, файл PDF загружается.

В некоторых случаях IE7 наши пользователи сообщают, что получают сообщение об ошибке:

"Internet Explorer не может загрузить Publish.aspx с thesite.com

Internet Explorer не смог открыть этот интернет-сайт. Запрашиваемый сайт либо недоступен, либо не может быть найден. Пожалуйста, попробуйте позже ".

Publish.aspx - это страница, на которой находится кнопка, поэтому страница доступна . IE должен загружать PDF.

Что-то не так с приведенным выше кодом, который может быть причиной этого на некоторых машинах? Или это связано с конкретными настройками безопасности / ОС / браузера?

EDIT:

Это заголовки ответа от fiddler:

HTTP/1.1 200 OK
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Content-Type: application/octetstream
Expires: -1
Server: Microsoft-IIS/7.5
Content-Disposition: attachment; filename=myPdf.pdf
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Date: Fri, 12 Nov 2010 09:48:06 GMT
Content-Length: 45772

Ответы [ 7 ]

3 голосов
/ 12 ноября 2010

Это может быть потому, что правильный тип пантомимы application/octet-stream, а не application/octetstream.

2 голосов
/ 12 ноября 2010

Совсем недавно я столкнулся с той же ошибкой. В моем случае я использовал https и не кэшировал. Кажется, это функция безопасности в IE, чтобы не загружать файл. Из IEInternals Эрика:

если пользователь пытается загрузить * файл через соединение HTTPS, любые заголовки ответа, которые препятствуют кэшированию, приведут к сбою процесса загрузки файла.

http://blogs.msdn.com/b/ieinternals/archive/2009/10/02/internet-explorer-cannot-download-over-https-when-no-cache.aspx

2 голосов
/ 12 ноября 2010

попробуйте использовать Response.OutputStream

filepath= Server.MapPath(filepath);
                FileStream strm = new FileStream(filepath, FileMode.Open, FileAccess.Read);

                byte[] fileByte = new byte[strm.Length];
                int x = strm.Read(fileByte, 0, fileByte.Length);

                Response.Clear();
                Response.AddHeader("Accept-Header", fileByte.Length.ToString());
                Response.AddHeader("Content-Disposition","inline; filename=" + filename);
                Response.ContentType = "application/pdf";
                Response.OutputStream.Write(fileByte, 0, fileByte.Length);
                Response.Flush();
                strm.Close();

и ваш тип контента должен быть = "application / pdf"

1 голос
/ 12 ноября 2010

Николас прав, что «octetstream» (без тире) не известен MIME Type .

Я предлагаю использовать application/pdf.

0 голосов
/ 12 ноября 2010

ОК, я исправил тип контента в application / octet-stream и изменил кеширование. Кажется, это проблема IE + SSL, поэтому я выясню, работает ли она, когда будет развернута позже этим вечером. Спасибо за помощь.

0 голосов
/ 12 ноября 2010

Если вы используете response.TransmitFile / response.WriteFile?

TransmitFile (MSDN)
WriteFile (MSDN)

0 голосов
/ 12 ноября 2010

Нашел в Google решение аналогичной проблемы:

Response.AppendHeader('Expires', 'Sun, 17 Dec 1989 07:30:00 GMT');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...