Chrome, pdf-дисплей, Дублированные заголовки, полученные с сервера
У меня есть раздел на веб-сайте, где я показываю PDF внутри световой коробки. Недавнее обновление хром нарушило это отображение:
Ошибка 349 (net:: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): Получено несколько заголовков Content-Disposition. Это запрещено защищать от атак, отбрасывающих ответ HTTP.
Это все еще корректно работает в IE.
Я использую ASP.NET MVC3 на IIS6
Код, который я использую для создания файла, выглядит следующим образом.
Если я удалю оператор inline, тогда загрузка файла, тем не менее, нарушит функциональность лайтбокса.
Код ошибки
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");
Ответы
Ответ 1
Решение выше хорошо, если вам не нужно указывать имя файла, но мы хотели сохранить имя файла по умолчанию, указанное для пользователя.
Наше решение оказалось тем же самым именем файла, что и некоторые запятые. Я заменил запятую на "", и файл теперь доставляет документ, как ожидалось, в Chrome.
FileName = FileName.Replace(",", "")
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=" & FileName)
Response.BinaryWrite(myPDF)
Ответ 2
Я использовал комментарий @roryok, обернув имя файла в кавычки:
Response.AddHeader("content-disposition", "attachment; filename=\"" + FileName + "\"")
Ответ на код с использованием одиночных кавычек недействителен в IE. Файл, загруженный одиночными кавычками, все еще находится в имени.
Ответ 3
У этой проблемы сегодня. На рореке и других, решение заключалось в том, чтобы поместить имя файла в кавычки.
Предыдущий, Chrome FAIL:
header("Content-Disposition: attachment; filename=$file");
Текущий, Chrome ОК:
header("Content-Disposition: attachment; filename='$file'");
Обратите внимание на цитаты вокруг $file
.
Ответ 4
Моя проблема была вызвана двойной цитатой, как показано ниже:
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)));*
Ответ 5
чтобы исправить это для любого типа файла с пользовательским именем файла, удалите (или похожие заголовки)
Response.AppendHeader("Content-Disposition", "inline;");
и добавьте
string fileName = "myfile.xlsx"
return File(fileStream, System.Web.MimeMapping.GetMimeMapping(Path.GetFileName(filePath)), fileName);
вы также можете использовать путь к файлу вместо потока в первом параметре