Chrome, affichage pdf, en-têtes dupliqués reçus du serveur

J’ai une section sur un site Web sur laquelle j’affiche un pdf dans une boite à lumière. La récente mise à niveau de chrome a rompu cet affichage:

Erreur 349 (net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): Plusieurs en-têtes Content-Disposition reçus. Ceci est interdit pour protéger contre les attaques par 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 en ligne, le fichier est téléchargé, mais cela rompt la fonctionnalité de la lightbox.

Code de problème

public FileResult PrintServices() { //... unrelated code removed MemoryStream memoryStream = new MemoryStream(); pdfRenderer.PdfDocument.Save(memoryStream); ssortingng filename = "ServicesSummary.pdf"; Response.AppendHeader("Content-Disposition", "inline;"); return File(memoryStream.ToArray(), "application/pdf", filename); } 

Le correctif

Retirer

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

Puis change

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

à

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

La solution ci-dessus convient si vous n’avez pas besoin de spécifier le nom de fichier, mais nous avons souhaité conserver le nom de fichier par défaut pour l’utilisateur.

Notre solution a fini par être le nom de fichier lui-même car il contenait des virgules. J’ai fait un remplacement sur les virgules par “” et le fichier délivre 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) 

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

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

La réponse de @a codeur à l’utilisation des guillemets simples n’a pas fonctionné comme prévu dans IE. Le fichier téléchargé avec les guillemets simples encore dans le nom.

Eu ce problème aujourd’hui. Par 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 du $file .

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 append

 ssortingng 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 stream dans le premier paramètre

Mon problème était dû à la double citation ci-dessous:

 var encoding = System.Text.Encoding.UTF8; *Response.AddHeader("Content-Disposition", ssortingng.Format("attachment; filename=**\"{0}\"**", HttpUtility.UrlEncode(file, encoding)));* 

Changer ce qui précède a fonctionné!

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

J’avais le même problème et je l’ai corrigé en supprimant simplement le nom du fichier de la déclaration 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é.