J'ai une application ASP.net qui renvoie un fichier PDF binaire (stocké à partir de la base de données, qui a été précédemment téléchargé) au client.Comment afficher la pièce jointe PDF dans IE6
Le code que j'ai fonctionne très bien pour tous les navigateurs, sauf Internet Explorer 6 (histoire de ma vie!). Dans IE6, lorsqu'un utilisateur clique sur "ouvert", Adobe signale l'erreur suivante: "Une erreur s'est produite lors de l'ouverture de ce document." Impossible de trouver le fichier. " Lorsque l'utilisateur clique sur Enregistrer, le PDF enregistre bien et peut être ouvert en double-cliquant dessus. Je suis perplexe. Google a donné des suggestions de mise en cache (définition de cachecontrol à private etc) et j'ai essayé tout cela mais rien n'a fonctionné. Le comportement wierd (er) est quand je génère un PDF dans ma couche serveur ASP. Net (en utilisant NFop) à partir de zéro, IE l'ouvrira bien (en utilisant le même code!).
Voici mon code pour envoyer les données binaires à travers le fil:
// Firefox doesn't like spaces in filenames.
filename = filename.Replace(" ", "_");
string extension = Path.GetExtension(filename);
string contentType;
switch (extension)
{
case "pdf":
contentType = "application/pdf";
break;
default:
contentType = "application/x-unknown";
break;
}
context.Response.Clear();
context.Response.AddHeader("content-disposition", "attachment;filename=" + filename);
context.Response.Charset = "";
context.Response.ContentType = contentType;
context.Response.BinaryWrite(data);
context.Response.Flush();
Voici les versions d'application:
- 3.5 ASP .net
- IE6.0.2900.2180.xpsp_s
- Article de liste
- p2_gdr.091208-2028
- Adobe Reader 8.0.0 Version
- Windows XP SP 2
- SQL Server 2008
Toute aide/suggestions serait très apprécié. Merci :)
EDIT:
J'ai branché Fiddler pour voir les en-têtes et il ne suffit que semble être un problème de mise en cache. Grrr!
Lorsque mon PDF NFop (celui qui fonctionne) est téléchargé, il envoie cache-control = private. Lorsque ma pièce jointe PDF (celle qui ne fonctionne pas) est téléchargée, elle envoie un non-cache.
J'ai regardé dans l'objet Response et les deux semblent avoir les mêmes en-têtes quand j'appelle context.Response.Flush().
Toujours perplexe!
SOLVED:
Quelque part dans notre cadre était une méthode escroc qui a été invoquée par réflexion:
/// /// Définit le expiratoin de la demande et la force ne cache /// protected void SetCacheExpiration (Contexte HttpContext) { // définit le cache pour qu'il expire immédiatement context.Response.Cache.SetCacheability (HttpCacheability.NoCache); context.Response.Cache.SetSlidingExpiration (true); context.Response.Cache.SetExpires (DateTime.Now); context.Response.Cache.SetMaxAge (new TimeSpan (0, 0, 0)); context.Response.Cache.SetNoStore(); context.Response.Cache.SetAllowResponseInBrowserHistory (false); context.Response.Cache.SetValidUntilExpires (false); context.Response.Cache.SetRevalidation (HttpCacheRevalidation.AllCaches);
}
Merci pour votre aide, mise en cache! Il est intéressant que le seul navigateur qui n'a pas réellement mis en cache le téléchargement (lorsqu'il est ouvert) était IE6.
Vous devriez appeler 'Path.GetExtension (fileName)'. – SLaks
Merci pour le pourboire! :) – Russell
Notez que 'Path.GetExtension (fileName)' inclura le '.'. – SLaks