J'ai une section sur un site Web où j'affiche un pdf à l'intérieur d'une boîte à lumière. La récente mise à niveau chrome a cassé cet affichage:
Erreur 349 (net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): plusieurs en-têtes Content-Disposition ont été reçus. Ceci n'est pas autorisé pour protéger contre les attaques de fractionnement de réponse HTTP.
Cela fonctionne toujours correctement dans IE.
J'utilise ASP.NET MVC3 sur IIS6
Le code que j'utilise pour générer le fichier est le suivant.
Si je supprime l'instruction inline, le fichier est téléchargé, mais cela rompt la fonctionnalité lightbox.
Code du problème
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);
}
Le correctif
Retirer
Response.AppendHeader("Content-Disposition", "inline;");
Puis changez
return File(memoryStream.ToArray(), "application/pdf", filename);
à
return File(memoryStream.ToArray(), "application/pdf");
La solution ci-dessus est très bien si vous n'avez pas besoin de spécifier le nom de fichier, mais nous voulions conserver le nom de fichier par défaut spécifié pour l'utilisateur.
Notre solution a fini par être le nom de fichier lui-même car il contenait des virgules. J'ai remplacé les virgules par "" et le fichier délivre désormais le document comme prévu dans Chrome.
FileName = FileName.Replace(",", "")
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=" & FileName)
Response.BinaryWrite(myPDF)
J'ai utilisé le commentaire de @ roryok, enveloppant le nom de fichier entre guillemets:
Response.AddHeader("content-disposition", "attachment; filename=\"" + FileName + "\"")
La réponse d'un codeur @a d'utiliser des guillemets simples n'a pas fonctionné comme prévu dans IE. Le fichier téléchargé avec les guillemets simples toujours dans le nom.
Eu ce problème aujourd'hui. Par roryok et autres, la solution était de mettre le nom de fichier entre guillemets.
Précédent, Chrome FAIL:
header("Content-Disposition: attachment; filename=$file");
Actuel, Chrome OK:
header("Content-Disposition: attachment; filename='$file'");
Notez les guillemets autour de $file
.
J'avais le même problème et je l'ai résolu en supprimant simplement le nom de fichier de l'instruction de retour.
Changement:
return File(outStream.ToArray(), "application/pdf", "Certificate.pdf");
à:
return File(outStream.ToArray(), "application/pdf");
Et GARDEZ le:
Response.AddHeader("content-disposition", "attachment;filename=\"" + "Certificate.pdf" + "\"");
Cela conserve toujours le nom du fichier téléchargé.
Mon problème était dû à la double citation comme indiqué ci-dessous:
var encoding = System.Text.Encoding.UTF8;
*Response.AddHeader("Content-Disposition", string.Format("attachment; filename=**\"{0}\"**", HttpUtility.UrlEncode(file, encoding)));*
Changer ce qui précède a fonctionné!
*Response.AddHeader("Content-Disposition", string.Format("attachment; filename=**{0}**", HttpUtility.UrlEncode(file, encoding)));*
pour résoudre ce problème pour tout type de fichier avec un nom de fichier personnalisé, supprimez le (ou les en-têtes similaires)
Response.AppendHeader("Content-Disposition", "inline;");
et ajouter
string fileName = "myfile.xlsx"
return File(fileStream, System.Web.MimeMapping.GetMimeMapping(Path.GetFileName(filePath)), fileName);
vous pouvez également utiliser le chemin de fichier au lieu d'un flux dans le premier paramètre