2010-11-30 24 views
0

J'ai écrit une servlet qui va retourner un fichier csv (généré dynamiquement) à l'utilisateur à télécharger. Cependant, le client ne peut pas voir la taille du fichier, ce qui signifie qu'il ne reçoit aucun indicateur de progression.java générer le fichier csv dynamique pour le téléchargement

J'ai ce code

protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException { 
    try { 
    String csv = getCsv(); 

    resp.setContentType("text/csv"); 
    resp.setContentLength(csv.getBytes().length); 
    resp.getWriter().write(csv); 
    } catch (Exception e) { 
    log.error("error generating feed", e); 
    } 
} 

merci.

+0

Quelle est exactement la question ici? – ColinD

+1

Je suppose qu'il veut que l'indicateur de progression indique la taille du fichier. – tHeSiD

+0

Appliquez-vous une compression (gzip ou similaire)? – thejh

Répondre

1

La taille du fichier est envoyée dans un Response Header, plus précisément l'en-tête Content-Length. Vous devez construire la réponse entière soit en mémoire ou sur le disque et calculer sa taille et envoyer l'en-tête Content-Length avec cette taille pour que le client sache comment calculer un indicateur de progression. Vous aussi avec certains navigateurs non standard (IE) devez définir le Disposition du fichier pour obtenir la boîte de dialogue Télécharger le fichier à afficher et traiter la réponse correctement avec un indicateur de progression. Essayez d'utiliser un navigateur comme Firefox et l'extension 'Live HTTP Headers' et 'Firebug' pour déboguer ce qui est réellement renvoyé.

Vous ne dites pas dans quels navigateurs cela ne fonctionne pas, donc cela peut être spécifique aux navigateurs et nécessiter des méta-données spécifiques aux navigateurs supplémentaires.

+0

L'OP définit le 'Content-Length':' resp.setContentLength (csv.getBytes(). Length); ' – thejh

+0

cela ne signifie pas qu'il est interprété par le navigateur qu'ils ne mentionnent pas correctement, c'est pourquoi j'ai suggéré le débogage avec les en-têtes HTTP de Firefox et Live et Firebug. –