Longueur du fichier de téléchargement IIS7
-
06-07-2019 - |
Question
J'ai le code suivant pour le téléchargement de fichier:
FileInfo fileInfo = new FileInfo(filePath);
context.Response.Clear();
context.Response.ContentType = "application/octet-stream";
context.Response.AddHeader("Content-Disposition", "attachment; filename=" + System.IO.Path.GetFileName(filePath));
context.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
context.Response.WriteFile(filePath);
context.Response.End();
Lorsque je l'exécute sur mon IIS6 local, cela fonctionne bien. Navigateur Web (testé sur IE8, Firefox 3.5.2, Opera 10) indique la longueur du fichier avant que je ne commence à télécharger le fichier.
Lorsque j'exécute ce code sur IIS7 distant, le navigateur Web n'affiche pas la longueur du fichier. La longueur du fichier est inconnue.
Pourquoi le fichier n'est-il pas long lorsque ce code est exécuté sous IIS7?
La solution
Utilisez Fiddler pour vérifier ce qui est réellement envoyé. Je suppose que vous obtenez un codage fragmenté suite à la définition de la mise en mémoire tampon sur false sur le serveur IIS7.
BTW, laissez tomber le Response.End appeler c'est une chose assez traumatisante à faire et est inutile (d'ailleurs l'appel à Clear).
Modifier
À proprement parler, lorsque vous diffusez du contenu avec un codage en bloc (ce qui est souhaitable dans votre scénario), l'en-tête Content-Length ne doit pas être présent (voir RFC2616 Section 4.4 .) Il me semble qu'IIS7 se charge de le faire respecter. En fait, j'ai eu un scénario Classic-ASP dans lequel IIS7 génère une erreur lorsque le code COM tente d'ajouter un en-tête Content-Length lorsque la mise en mémoire tampon est désactivée.
C’est vraiment ennuyeux car, malgré ce que souhaite le comité des tours d’ivoire, cet en-tête offre à l’utilisateur final une information très utile.
Autres conseils
Merci pour ce post .... je l'ai obtenu pour IE avec la première ligne.
public void WriteCSV(string strData) { //Required for IIs7 WS2008R2 fix Response.ClearHeaders(); Response.Clear(); Response.Buffer = true; Response.ContentType = "application/csv"; Response.AddHeader("Content-Disposition", "attachment;filename=report.csv"); Response.Write(strData); Response.Flush(); Response.End(); }