IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GWT et Vaadin Java Discussion :

Proposer le téléchargement d'un fichier côté client (GWT)


Sujet :

GWT et Vaadin Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut Proposer le téléchargement d'un fichier côté client (GWT)
    Bonjour à tous,

    Je souhaiterais proposer à l'utilisateur de télécharger un fichier csv dans mon application GWT. Pour l'instant, j'ai créé le fichier et l'ait rempli avec des données bidons. Après l'exécution du ocde ci-dessous, le fichier est bien enregistré sur mon disque dur (emplacement : C:\test.csv)
    Voici le code de ma servlet (côté serveur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    try {
       StringBuffer buffer = new StringBuffer();
       buffer.append("Employee Code");
       buffer.append(',');
       buffer.append("Employee Name");
       buffer.append(',');
       buffer.append("Employee Address");
       buffer.append('\n');
       ...
       String csv = buffer.toString();
       PrintWriter flux = new PrintWriter(new FileWriter("C:\\test.csv"));
       flux.print(csv);
       flux.close();
    } catch (IOException e) {}
    Comment puis-je faire pour proposer le téléchargement côté client (GWT) ?
    Comment puis-je renvoyer le fichier à ma couche cliente ?
    Comment proposer automatiquement le téléchargement du fichier ?

    J'ai vu pas mal de choses sur le forum. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    OutputStream os = response.getOutputStream();
    response.setContentType("text/csv");
    response.addHeader("Content-disposition", "attachment; filename=\"administrator_config.csv\"");
    os.write(...);
    Mais j'avoue que je n'y comprend pas grand chose.

    Merci d'avance.

  2. #2
    Membre chevronné
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Par défaut
    Bonjour,

    Tu as deux solutions élégantes à ton problème.

    1 - Utiliser une servlet pour renvoyer ton fichier.
    2 - Ecrire ton fichier dans un espace http public et afficher des simple lien html pour que l'utilisateur les télécharges

    Les deux solutions sont finalement très proche, mais la première solution à l'avantage de pouvoir "sécuriser" tes fichiers en ne donnant accès qu'aux utilisateurs ayant les droits. La seconde à l'avantage d'être plus simple à mettre en place puisque tu n'as finalement pas grand chose à faire (le dossier public existe par defaut en général).

    Le bout de code que tu donnes correspond à la solution 1. Si tu souhaites des explications n'hésites pas à demander.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Merci pour ta réponse si rapide.

    Je préfèrerai la première solution, en effet, comme ça, l'utilisateur clique sur un bouton "Télécharger", ça fait un appel RPC. Côté serveur, ça construit mon fichier et le renvoie. Ensuite, l'utilisateur obtient automatiquement une fenêtre pour télécharger le fichier .csv
    J'ai en effet pas mal de questions. Le bout de code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    OutputStream os = response.getOutputStream();
    response.setContentType("text/csv");
    response.addHeader("Content-disposition", "attachment; filename=\"administrator_config.csv\"");
    os.write(...);
    1) C'est le code qui va dans ma servlet côté serveur. Cependant, l'élément que je renvoie côté client (dans le callback), c'est quoi ? un fichier java.io.File ? le fichier OutputStream os ?
    2) Et ensuite, que dois-je faire côté client (dans mon callback) pour que l'utilisateur voit une fenêtre s'ouvrir automatiquement avec le fichier téléchargeable ?

    Je pose peut être des questions idiotes mais visiblement, il y a des choses que je n'ai pas comprises.

  4. #4
    Membre chevronné
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Par défaut
    Tu te trompe.

    Que ce soit le solution 1 ou la solution 2 la même fenêtre s'ouvrira. Ce sera la fenetre de téléchargement du navigateur qui s'ouvrira.

    --
    Partons sur la solution 1.

    En fait tu ne dois pas faire d'appel Rpc. Il n'y aura pas de callback à implémenter non plus.

    Tu dois écrire une simple Servlet standard qui va renvoyer en réponse le flux du document, avec le bout de code de ton premier post. Côté GWT tu dois seulement effectuer un appel Http get à l'aide d'un lien hypertexte ou avec un bouton de formulaire.

    Ta servlet va donc recevoir une requete GET, elle va renvoyer à ton navigateur une réponse dans lequel se trouvera en corp le document et en en-tête de la réponse se trouvera le content-type et le Content-Length adéquate.

    Le navigateur en recevant cette réponse va ouvrir une fenetre de téléchargement avec laquel tu pourras enregistrer ou ouvrir le document.

    Astuce au cas où tu ne maitrises pas les Servlet. Tu dois déclarer ta Servlet dans ton fichier web.xml. Je te conseille de terminer les appels rpc par *rpc afin de pouvoir séparer les appels Rpc des Autres appels (Servlet, fichier..)
    --
    Solution 2

    je t'encourage à commencer par essayer la solution 2. Tu verras que tu te prendra moins la tête car tu n'aura pas à gérer les entêtes de réponse de tes flux Http. C'est ton serveur web en frontal qui s'en occupera.

    Commence par copier / coller un doc dans le dossier public. Et fait un lien hypertexte sur ta page avec l'url qu'il faut pour le télécharger. Tu verras que c'est très rapide à faire et je pense que ca répondra mieux à ton besoin.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Ok. Partons pour la solution 2.
    Le soucis, c'est que je n'ai pas de dossier "public" puisque j'utilise Maven2 dans mon projet. Je crois que ce sont les images qui vont dans le dossier "public" et moi, mes images se trouvent dans : src/main/webapp/images/
    Dois créer lle répertoire public à l'emplacement suivant : src/main/webapp/public/
    Je mets donc ensuite un fichier .csv dedans.
    Et ensuite, comment je fais pour trouver l'URL qu'il faut pour télécharger le fichier ? Ca doit être dans le web.xml, non ?
    Merci pour ta participation à mon problème et désolé de ne pas être plus compétent que ça.

  6. #6
    Membre chevronné
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Par défaut
    Pas de problème, c'est en affrontant ces problèmes que tu connaitras les réponses par la suite. Nous sommes tous passé par là

    Maven2 te donne une structure de projet qui te permet de te retrouver facilement en passant d'un projet M2 à un autre. Normal c'est toujours la même chose (lorsque le standard est suivi car on peut toujours configurer pour personnaliser, ce qui n'est pas une bonne chose dans l'absolu)

    Tes fichiers sources seront donc organisé d'une certaine manière. Lorsque tu va packager ton application, c'est à dire, lorsque tu va construire ton war avec la commande "mvn package", maven va copier les fichiers qui se trouvent dans src et va les coller dans le repertoire target dans le bon emplacement.

    Tout ce qui se trouve dans le repertoire "src/main/webapp" sera copié dans le war.

    Donc ton repertoire image est un repertoire src/main/webapp/images qui sera accessible par Http et par tout le monde.

    Tu peux essayer en lancant ton application avec gwt:run. Une fois ton application lancé avec une url du type http://localhost:8080/mon.package/monApplication.html

    Essais d'ouvrir une image en tapant se genre d'URL dans ton navigateur http://localhost:8080/mon.package/im...oireImages.png

    Tu verras que tes images sont bien accessible à tout le monde par une simple requete Http GET.

    Maintenant si tu places ton fichier csv dans ce reprtoire, tu y aura accès de la même manière.

    Tu peux créer un repertoire "files" à côté du repertoire "images" afin d'organiser un peu mieux tes images mais le principes reste le même: Tous les reprtoire qui se trouve dans ton war, a part le WEB-INF sont accessible en public.

    J'espere que ca t'aidera,
    +

    PS: vas y pas à pas, commence par mettre ton fichier csv dans images avant de créer tout de suite un nouveau repertoire. Si tu as un soucis revient en parler.

    PS2: normalement tu devrais avoir un repertoire public avec maven2 qui se trouve là: src/main/resources/public

    PS3: petit lien sur le sujet
    http://blog.octo.com/environnement-d...e-pour-gwt-17/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/12/2011, 17h43
  2. [CSV] Proposer le téléchargement d'un fichier
    Par virgrennes dans le forum Langage
    Réponses: 21
    Dernier message: 04/01/2008, 10h56
  3. Proposer le téléchargement d'un fichier
    Par black is beautiful dans le forum ASP
    Réponses: 8
    Dernier message: 10/09/2007, 14h59
  4. Obliger un fichier (quelqu'en soit l'extension) à se proposer en téléchargement
    Par Larsen00 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 06/06/2007, 13h19
  5. Réponses: 4
    Dernier message: 09/04/2006, 01h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo