2008-09-23 2 views
4

J'ai remarqué qu'Internet Explorer ajoute un chiffre entre crochets aux fichiers téléchargés depuis Internet (généralement [1]). Cela crée un gros problème avec le téléchargement des feuilles de calcul Excel car les crochets ne sont pas un caractère de nom de fichier valide dans le nom de feuille de calcul Excel. Ce problème est spécifique à IE, les autres navigateurs gardent le même nom de fichier. Par conséquent, si vous avez un tableau pivotant actualisé automatiquement à l'ouverture du fichier, par exemple, vous obtiendrez un message d'erreur indiquant que le nom "fichier [1] .votreNomPivot" n'est pas valide.Comment contourner le bug [1] IE lors de l'enregistrement d'un fichier Excel à partir d'un serveur Web?

Y at-il une solution à ce problème?

EDIT: Il semble que quel que soit le nom de fichier suggéré par les directives HTTP, IE ajoute [1] dans tous les cas, ce qui cause le problème! (Donc, les réponses sur les noms de fichiers ne sont pas utiles dans ce cas)

EDIT: J'ai essayé du code VBA pour enregistrer le fichier sous un autre nom quand il s'ouvrira. Cependant, cela ne fonctionne pas (même message d'erreur qu'avant). Pensez-vous qu'il existe un moyen de résoudre ce problème avec VBA?

+0

J'ai essayé d'enregistrer le fichier sous un autre nom par une macro Excel mais le problème est toujours présent, même si le nom du fichier a changé de nom ... – paulgreg

+0

Installez un nouvel Internet Explorer. Cela n'a rien à voir avec le serveur web. –

+0

Nouveau Internet Explorer? Que voulez-vous dire ? J'utilise IE 6 maintenant mais le défaut semble apparaître dans IE 7 aussi: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1398316&SiteID=1 et http://bytes.com/forum/thread751225 .html – paulgreg

Répondre

0

En fait, le .NET code correct est le suivant:

Response.AppendHeader("content-disposition", "attachment;filename=file.xls"); 
Response.ContentType = "application/vnd.ms-excel"; 

Note: AppendHeader, non AddHeader, que je pense ne fonctionne que dans le débogage serveur web et IIS7.

+0

Arrêtez de voter les bonnes réponses aux questions mal posées. –

-1

Dans .NET, j'ai trouvé de l'expérience que cela semble fonctionner pour moi:

  Response.AddHeader("Content-Disposition", "attachment; filename=excel.xls"); 
      Response.AddHeader("Content-Type", "application/vnd.ms-excel"); 
      Response.ContentType = "application/vnd.ms-excel"; 

La duplication des odeurs, mais jusqu'à présent je n'ai jamais eu au fond de celui-ci (peut-être après Sebs explique cela) . Aussi la valeur "content-Disposition" apparaît très finicky use a: au lieu de a; ou ommit l'espace entre elle et 'filename' et ça souffle!

Aussi, si vous avez la compression est activée sur IIS cela peut arranger les choses pour vous:

Response.ClearHeaders() 
2

Je pense que cela se produit lorsque vous ouvrez la feuille de calcul dans IE et IE enregistre dans un fichier temporaire. Et je pense que cela n'arrive que lorsque le nom de fichier de la feuille de calcul contient plus d'un point. Essayez-le avec un simple "sample.xls". Une autre solution consiste à dire aux utilisateurs d'enregistrer le fichier sur le bureau puis de l'ouvrir.

+0

Je ne peux pas, dans mon cas, utiliser une seule feuille mais, vous êtes vrai, le problème se produit uniquement lorsque vous essayez d'ouvrir le fichier directement, pas si vous le sauvegardez. Mais ce n'est pas une bonne réponse "conviviale" ... :) – paulgreg

+0

Quelle est la configuration de votre serveur? IIS? Apache? En utilisant un CMS? L'aide à la réécriture d'URL serait-elle utile? – Liam

+0

Ma webapp est basée sur J2EE, fonctionnant sur IBM Web Application Server, derrière un serveur apache IBM (IHS) modifié. La réécriture d'URL n'aidera pas, car c'est la façon dont IE fonctionne.Je pense plus à quelques macros VBA pour me sauver ... – paulgreg

2

Il s'agit d'une fonctionnalité intégrée à Internet Explorer. Arrêtez d'utiliser "Ouvrir", commencez par utiliser "Enregistrer" dans la fenêtre de téléchargement de fichier, sinon IE ajoutera "[1]" au nom de fichier du fichier qu'il place dans un dossier temporaire.

Vous pouvez créer une application .NET en utilisant System.IO.FileSystemWatcher qui attrape l'événement de la création du fichier téléchargé ou quelque chose et renomme le fichier.

0

Ce qui suit a fonctionné pour moi:

private string EncodeFileName(string fileName) 
    { 
     fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8).Replace("+", " "); 
     if (HttpContext.Current.Request.UserAgent.ToLower().Contains("msie")) 
     { 
      var res = new StringBuilder(); 
      var chArr = fileName.ToCharArray(); 
      for (var j = 0; j < chArr.Length; j++) 
      { 
       if (chArr[j] == '.' && j != fileName.LastIndexOf(".")) 
        res.Append("%2E"); 
       else 
        res.Append(chArr[j]); 
      } 
      fileName = res.ToString(); 
     } 
     return "\"" + fileName + "\""; 
    } 
0

Vous pouvez tout simplement faire en sorte que dans la zone d'options pour le pivot du rafraîchissement automatique est éteint. Maintenant, même lorsqu'il est ouvert à partir du serveur pivot fonctionnera parfaitement

0

Mettez ces quatre lignes dans votre code:

response.reset(); 
response.setHeader("Expires", "0"); 
response.setHeader("Cache-Control","must-revalidate,post-check=0, pre-check=0"); 
response.setHeader("Pragma", "public"); 

Hope this helps.

0

J'ai rencontré le même problème et suis venu avec (imo) une meilleure solution qui n'a pas besoin de VBA.

Si vous définissez l'en-tête "Content-Disposition" sur "attachment; filename = < ...>" au lieu de "inline; filename = < ...>" les navigateurs normaux ouvriront une boîte de dialogue qui permettra de sauvegarder ou ouvrir un fichier avec un nom de fichier défini dans un en-tête, mais Internet Explorer se comportera de manière un peu bizarre. Il ouvrira le dialogue de téléchargement de fichier et si vous appuyez sur Save il suggérera un nom de fichier qui est défini dans l'en-tête, mais si vous appuyez sur Open il enregistrera le fichier dans un dossier temporaire et l'ouvrira avec un nom que est le Identique à votre URN (sans 'namespace'), par ex. si votre URI est http://server/folder/file.html, IE enregistrera votre fichier sous file.html (pas de parenthèses, woo hoo!). Cela nous amène à une solution:

Ecrire un script qui gère la demande de http://server/folder/ * et quand vous avez besoin de servir un fichier XLS simplement rediriger vers ce script (utilisez votre nom au lieu d'un astérisque) avec Content-Disposition ensemble à en ligne.

1

J'ai résolu ce problème en utilisant une méthode où nous transmettons 3 paramètres: Nom de fichier, extension de fichier (sans le .dot) et la requête HTTP); puis faire le codage UTF-8 du nom de fichier et de l'extension. Exemple de code:

public static String encoding(String fileName, String extension, HttpServletRequest request) 
{ 
    String user = request.getHeader("user-agent"); 
    boolean isInternetExplorer = (user.indexOf("MSIE") > -1); 
    String var = ""; 
    try 
    {   
    fileName = URLEncoder.encode(fileName, "UTF-8"); 
     fileName = fileName.trim().replaceAll("\\+", " "); 
     extension = URLEncoder.encode(extension, "UTF-8"); 
     extension = extension.trim().replaceAll("\\+", " "); 
     if (isInternetExplorer) 
     { 
     disposition = "attachment; filename=\"" + fileName+"."+extension+"\""; 
     } 
     else 
     { 
     var = "attachment; filename*=UTF-8''" + fileName+"."+extension; 
     }    
    } 
    catch (UnsupportedEncodingException ence) 
    { 
    var = "attachment; filename=\"" + fileName+"."+extension; 
     ence.printStackTrace(); 
    } 

    return var; 
} 

Cela a fonctionné très bien dans mon cas. J'espère que cela vous aidera tous.

Questions connexes