2010-11-12 11 views
4

J'ai une page qui lorsqu'un utilisateur clique sur un bouton, un fichier PDF est généré dynamiquement et leur téléchargement à télécharger.Téléchargement de PDF à partir de la page ASPX

C'est le code qui est de laisser l'utilisateur télécharger le pdf:

// Omitted code that generates the pdf bytes 

response.ContentType = "application/octetstream"; 
response.AppendHeader("Content-Disposition", "attachment; filename=" + filename); 
response.BinaryWrite(pdfBytes); 
response.End(); 

Sur ma machine, et bien d'autres en utilisant un mélange de Chrome, IE 7/8/9b et Firefox, cela fonctionne comme prévu; l'utilisateur clique sur le bouton, le PDF est téléchargé.

Sur certains cas de IE7, nos utilisateurs rapportent qu'ils obtiennent un message d'erreur:

« Internet Explorer ne peut pas télécharger Publish.aspx de thesite.com

Internet Explorer n'a pas pu ouvrir ce Site Internet Le site demandé est soit indisponible, soit introuvable. Veuillez réessayer plus tard ". Publier.aspx est la page sur laquelle le bouton réside, de sorte que la page est disponible. IE devrait télécharger le pdf.

Y at-il quelque chose qui ne va pas avec le code ci-dessus qui pourrait causer cela sur certaines machines? Ou est-ce à des paramètres de sécurité/OS/navigateur particuliers?

EDIT:

Ce sont les en-têtes de réponse de Fiddler:

HTTP/1.1 200 OK 
Cache-Control: no-cache, no-store, must-revalidate 
Pragma: no-cache 
Content-Type: application/octetstream 
Expires: -1 
Server: Microsoft-IIS/7.5 
Content-Disposition: attachment; filename=myPdf.pdf 
X-AspNet-Version: 2.0.50727 
X-Powered-By: ASP.NET 
Date: Fri, 12 Nov 2010 09:48:06 GMT 
Content-Length: 45772 
+0

Ce serait bien de voir tous les en-têtes de réponse. –

+0

Modifié pour inclure les en-têtes de réponse – DavidGouge

Répondre

2

Très récemment, j'ai rencontré la même erreur. Dans mon cas, j'utilisais https et aucune mise en cache. Il semble être une fonctionnalité de sécurité dans IE pour ne pas télécharger le fichier. De les IEInternals de EricLaw:

si un utilisateur essaie de télécharger un fichier * via une connexion HTTPS, les en-têtes de réponse qui empêchent la mise en cache provoquera le processus de téléchargement de fichiers à l'échec.

http://blogs.msdn.com/b/ieinternals/archive/2009/10/02/internet-explorer-cannot-download-over-https-when-no-cache.aspx

+0

Je courais dans le même problème. Voici une solution de contournement du site lié: "Mise à jour d'octobre 2010: J'ai mené une enquête plus approfondie sur ce problème, et j'ai trouvé (étonnamment) que vous pouvez spécifier Cache-Control: pas de stockage, pas de cache et le téléchargement fonctionnera , mais si vous spécifiez ces directives dans l'ordre inverse, cela échouera. " Je l'ai essayé et ça marche. Inversez les en-têtes de contrôle de cache. – John

3

C'est peut-être parce que le type MIME correct est application/octet-stream, pas application/octetstream.

+0

Bien que cela puisse poser un problème, ce n'est pas ce qui cause son erreur spécifique. Voir la réponse de Joop. – John

-2

Trouvé dans google solution de problème similaire:

Response.AppendHeader('Expires', 'Sun, 17 Dec 1989 07:30:00 GMT'); 
2

essayez d'utiliser Response.OutputStream

filepath= Server.MapPath(filepath); 
       FileStream strm = new FileStream(filepath, FileMode.Open, FileAccess.Read); 

       byte[] fileByte = new byte[strm.Length]; 
       int x = strm.Read(fileByte, 0, fileByte.Length); 

       Response.Clear(); 
       Response.AddHeader("Accept-Header", fileByte.Length.ToString()); 
       Response.AddHeader("Content-Disposition","inline; filename=" + filename); 
       Response.ContentType = "application/pdf"; 
       Response.OutputStream.Write(fileByte, 0, fileByte.Length); 
       Response.Flush(); 
       strm.Close(); 

et votre type de contenu doit être = "application/pdf"

+0

application/pdf permettra au navigateur d'afficher le PDF, s'il y a un plugin configuré pour le faire. application/octet-stream devrait demander à télécharger le fichier, quelle que soit la configuration du plugin. (Personnellement, je n'aime pas les fichiers PDF s'ouvrant dans le navigateur sans demander d'enregistrer.) – Matt

1

Nicolas est correct que "octetstream" (sans le tiret) n'est pas connu MIME Type. Je suggère l'utilisation application/pdf.

+0

En utilisant 'application/pdf', la plupart des navigateurs ouvriront directement le fichier pdf plutôt que de demander à l'utilisateur de le sauvegarder. –

0

OK, je l'ai corrigé le type de contenu à flux d'octets d'application/et modifié la mise en cache. Il semble que ce soit un problème IE + SSL, donc je vais savoir si ça fonctionne quand il sera déployé plus tard dans la soirée. Merci pour l'aide.