Chrome, отображение PDF, дубликаты заголовков, полученные с сервера - PullRequest
58 голосов
/ 21 декабря 2011

У меня есть раздел на веб-сайте, где я отображаю PDF внутри лайтбокса.Недавнее обновление Chrome нарушило это отображение:

Ошибка 349 (net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): получено несколько заголовков расположения содержимого.Это запрещено для защиты от атак с разделением ответов HTTP.

В IE это по-прежнему работает правильно.

Я использую ASP.NET MVC3 на IIS6

Код, который я использую для создания файла, выглядит следующим образом.

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

Код проблемы

public FileResult PrintServices()
{
    //... unrelated code removed
    MemoryStream memoryStream = new MemoryStream();
    pdfRenderer.PdfDocument.Save(memoryStream);
    string filename = "ServicesSummary.pdf";

    Response.AppendHeader("Content-Disposition", "inline;");

    return File(memoryStream.ToArray(), "application/pdf", filename);
}

Исправление

Удалить

Response.AppendHeader("Content-Disposition", "inline;");

Затем изменить

return File(memoryStream.ToArray(), "application/pdf", filename);

на

return File(memoryStream.ToArray(), "application/pdf");

Ответы [ 6 ]

69 голосов
/ 24 января 2012

Приведенное выше решение подходит, если вам не нужно указывать имя файла, но мы хотели оставить имя файла по умолчанию, заданное для пользователя.

Наше решение оказалось самим именем файла, так как содержало несколько запятых. Я заменил запятую на «», и теперь файл доставляет документ, как и ожидалось в Chrome.

FileName = FileName.Replace(",", "")

Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=" & FileName)    
Response.BinaryWrite(myPDF)
20 голосов
/ 14 августа 2014

Я использовал комментарий @ roryok, заключив имя файла в кавычки:

Response.AddHeader("content-disposition", "attachment; filename=\"" + FileName + "\"")

@ Ответ кодера об использовании одинарных кавычек не сработал, как ожидалось в IE.Файл, загруженный с одинарными кавычками, все еще в названии.

2 голосов
/ 07 августа 2014

Была эта проблема сегодня. Для Рорёка и других, решением было поместить имя файла в кавычки.

Предыдущий, Chrome FAIL:

header("Content-Disposition: attachment; filename=$file");

Ток, Хром в порядке:

header("Content-Disposition: attachment; filename='$file'");

Обратите внимание на кавычки вокруг $file.

1 голос
/ 01 мая 2018

У меня была та же проблема, и я исправил ее, просто удалив имя файла из оператора return.

Изменить:

 return File(outStream.ToArray(), "application/pdf", "Certificate.pdf");

на:

 return File(outStream.ToArray(), "application/pdf");

И УДЕРЖИТЬ:

Response.AddHeader("content-disposition", "attachment;filename=\"" + "Certificate.pdf" + "\"");

Это по-прежнему сохраняет имя для загруженного файла.

0 голосов
/ 15 марта 2016

, чтобы исправить это для любого типа файла с пользовательским именем, удалите (или подобные заголовки)

Response.AppendHeader("Content-Disposition", "inline;");

и добавьте

string fileName = "myfile.xlsx"
return File(fileStream, System.Web.MimeMapping.GetMimeMapping(Path.GetFileName(filePath)), fileName);

вы также можете использовать путь к файлу вместо потока в первом параметре

0 голосов
/ 06 января 2016

Моя проблема возникла из-за двойной кавычки, как показано ниже:

var encoding = System.Text.Encoding.UTF8;

*Response.AddHeader("Content-Disposition", string.Format("attachment; filename=**\"{0}\"**", HttpUtility.UrlEncode(file, encoding)));*

Изменение вышеприведенного слова на это сработало!

*Response.AddHeader("Content-Disposition", string.Format("attachment; filename=**{0}**", HttpUtility.UrlEncode(file, encoding)));*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...