web-dev-qa-db-fra.com

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

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");
58
BlairM

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)
70
2GDave

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.

20
Homer

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.

2
a coder

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é.

1
Barry Franklin

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)));*
0
hatsrumandcode

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

0
tedbaker