61 votes

Chrome, affichage pdf, en-têtes en double reçus du serveur

J'ai un article sur un site où je l'affichage d'un fichier pdf à l'intérieur d'une boîte à lumière. La récente chrome de mise à niveau a cassé cet affichage:

Erreur 349 (net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): Plusieurs Content-Disposition des en-têtes reçu. Ce n'est pas autorisé à se protéger contre de réponse HTTP-fractionnement des attaques.

Cela fonctionne encore correctement dans IE.

Je suis à l'aide d'ASP.NET MVC3 sur IIS6

Le code que j'utilise pour générer le fichier se présente comme suit.

Si je supprime la ligne de déclaration puis les téléchargements de fichiers, cependant que les pauses de la lightbox fonctionnalité.

Le Correctif

Supprimer

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

Puis Changement

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

pour

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

Problème De Code

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);
    }

77voto

2GDave Points 386

La solution ci-dessus convient 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 fournit maintenant le document comme prévu dans Chrome.

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

Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=" & FileName)    
Response.BinaryWrite(myPDF)
 

22voto

Homer Points 2775

J'ai utilisé le commentaire de @ roryok, en enveloppant le nom du fichier entre guillemets:

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

La réponse de @a coder consistant à utiliser des guillemets simples ne fonctionnait pas comme prévu dans IE. Le fichier téléchargé avec les guillemets simples toujours dans le nom.

2voto

a coder Points 1096

Avait ce problème aujourd'hui. Per roryok et d'autres, la solution consistait à mettre le nom du 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 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X