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 :

Ouvrir un fichier sans ouvrir de fenêtre


Sujet :

GWT et Vaadin Java

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 45
    Par défaut Ouvrir un fichier sans ouvrir de fenêtre
    Salut à tous.
    Voilà mon problème : je récupère depuis le serveur un stream, que j'aimerais ouvrir depuis le client. Je voudrais que cela fonctionne comme un clic sur un lien, c'est à dire sans ouvrir de nouvelle fenêtre, mais en proposant une pop-up "Enregistrer sous, Ouvrir, Annuler". Comment puis-je faire ? Cette action aurait lieu lors d'un double clic dans une liste, en faisant appel à une servlet.
    Merci à tous !

  2. #2
    Membre émérite
    Avatar de mamelouk
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    867
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 867
    Par défaut
    Salut,

    Tu veut dire un fichier par exemple? Est ce qu'il ne suffit pas de creer un lien vers le fichier?

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 45
    Par défaut
    Oui au final ça revient à ouvrir un fichier.
    Le problème, c'est que j'ai une liste de noms de fichiers dans une ListGrid (qui ne peuvent pas être des liens), et quand je double clique sur l'un d'entre eux, je fais un Window.open("mon_appel_de_servlet","bla","").
    Ce que je voudrais faire c'est pouvoir "simuler" le clic sur un lien (avoir le même résultat quoi).

  4. #4
    Membre émérite
    Avatar de mamelouk
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    867
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 867
    Par défaut
    ListGrid, kesako ? Tu peut pas mettre de code HTML là dedans?

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 62
    Par défaut
    il faut que tu renvoie le stream dans une reponse http et mettre un type mime offrant ces choix, le problème c'est que c'est dépendant de la conf du poste client

  6. #6
    Membre confirmé

    Inscrit en
    Juin 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2003
    Messages : 229
    Par défaut
    Le principe est assez simple :
    Ouvrir le stream, l'envoyer au client, mais en précisant auparavant les bons headers HTTP.

    Pour ma part, j'ai choisi pour faire ça, de passer par une servlet déclarée dans le package "server" de mon appli, qui correspond à l'implémentation des services asynchrones (ServerImpl.java)

    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
    16
    17
    18
    19
    20
    21
    22
    23
     
    package com.application.server;
     
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.util.*;
     
    public class OpenAttachment extends HttpServlet {
    	final static long serialVersionUID = 1;
     
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		int id = Integer.parseInt(request.getParameter("id"));
     
    		ServletOutputStream out = response.getOutputStream(); 
    		Attachment a = r.getAttachment(id);
    		response.setContentType(a.getContentType()); 
    	        response.setHeader("Content-Disposition", "attachment;filename=\"" + a.getFilename() + "\"");
     
    	        out.write(a.getData());
    		out.close();
    	}
    }
    Ici, a.getContentType() retourne le type MIME du stream envoyé (application/pdf, application/word, ...), et a.getData() retourne le stream sous forme de tableau d'octets (byte[])

    Ensuite, dans l'application GWT, j'ouvre cette page ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Window.open("OpenAttachment?id=" + id ,"Attachment", "");
    où id est un identfiant du fichier à télécharger.

    Enfin, je déclare la servlet dans le descripteur (application.gwt.xml)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <servlet path='/OpenAttachment' class='com.application.server.OpenAttachment'/>
    et c'est tout.

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 45
    Par défaut
    Merci pedouille, mais c'est exactement ce que je fais.
    Ce que je voudrais éviter, si possible, c'est l'appel à Window.open qui m'ouvre une fenêtre en plus de mon navigateur, en plus de la pop-up qui me propose "Enregistrer, ouvrir...".

  8. #8
    Membre confirmé

    Inscrit en
    Juin 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2003
    Messages : 229
    Par défaut
    Pardon, j'avais mal lu le sujet.

    Dans ce cas, le plus simple est de passer par le composant Frame (correspond à la balise iframe) :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    public class testApplication implements EntryPoint {
    	private Frame frame;
    	private Button clickMeButton;
    	public void onModuleLoad() {
    		RootPanel rootPanel = RootPanel.get();
     
    		clickMeButton = new Button();
    		rootPanel.add(clickMeButton);
    		clickMeButton.setText("Télécharger");
    		clickMeButton.addClickListener(new ClickListener() {
    			public void onClick(Widget sender) {
    				getFrame().setUrl("/FileServlet?params=2");
    			}
     
    		});
     
    		frame = new Frame("");
    		rootPanel.add(frame, 17, 122);
    		frame.setSize("465px", "154px");
    	}
    	public Frame getFrame() {
    		return frame;
    	}
    }

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 45
    Par défaut
    Merci, je teste dès que j'arrive à ravoir une interface graphique dans mon projet

  10. #10
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 45
    Par défaut
    Bon, j'ai pu tester, c'est presque ça. Enfin ça répond exactement à ma question, mais ça m'en pose une nouvelle :
    j'ajoute mes Frame dans un VLayout (parce que c'est là que mon code se trouve). Or, quand j'ajoute mes Frame, mon VLayout s'agrandit, à chaque fois de la taille de la plus grande case. Y a-t-il une méthode pour les VLayout pour dire d'ajuster la hauteur des lignes à leur contenu ?

    Edit : Finalement, j'ai utilisé Overflow.HIDDEN, qui me permet de ne pas changer de taille de VLayout. Merci à tous !

  11. #11
    Membre confirmé

    Inscrit en
    Juin 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2003
    Messages : 229
    Par défaut
    Est-ce que tu pourrais mettre la Frame dans un AbsolutePanel non affiché, ou quelquechose de ce genre pour éviter de casser la présentation.

    Au final, on n'a besoin de déclarer qu'un seul composant Frame, et l'utiliser à chaque fois qu'on a besoin de proposer un fichier à télécharger, sans pour autant que cette frame soit visible.

  12. #12
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 45
    Par défaut
    Alors j'ai testé ta méthode, donc le coup de une seule frame ça me va très bien, mais le absolutepanel, même si je ne l'affiche pas, je dois l'ajouter à mon Layout non ? Et dans ce cas, si je repasse en Overflow.AUTO, ça me met un espace vide. Donc j'ai laissé en HIDDEN. Mais sinon ça marche très bien et ça m'évite d'ajouter plusieurs Frames.

  13. #13
    Membre confirmé

    Inscrit en
    Juin 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2003
    Messages : 229
    Par défaut
    Essaye de voir en définissant la propriété CSS "display: none;". Avec un peu de chance, ça ne modifiera pas l'affichage des layouts.

  14. #14
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 45
    Par défaut
    Hum, je ne suis pas super calé en interfaces graphiques (c'est mon premier projet GWT) ; où puis-je modifier cette option ?

  15. #15
    Membre confirmé

    Inscrit en
    Juin 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2003
    Messages : 229
    Par défaut
    Il faut attribuer une classe CSS au widget :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    widget.setStyleName(".gwt-nomdustyle");
    et dans la feuille de style du projet (tu peux trouver sa définition dans le .gwt.xml du projet "<stylesheet src="style.css"/>"), tu ajoutes le style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    .gwt-nomdustyle{
       display: none;
    }

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 7
    Par défaut
    Bonjour,

    Je voudrais savoir s'il serait possible d'avoir le même résultat sans créer de nouvelle servlet ?

    J'ai une méthode dans ma classe *Impl qui construit un rapport que je peux générer au format pdf, doc etc..

    Je voudrais si c'est possible, renvoyer au client un outputStream ou un byte[] et que le client puisse alors proposer le téléchargement de ce fichier..

    Si quelqu'un a une idée, elle est la bienvenue

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

Discussions similaires

  1. Lire partie de fichier sans ouvrir le fichier
    Par calitom dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 17/01/2013, 17h04
  2. Réponses: 18
    Dernier message: 03/10/2011, 10h48
  3. Comment ouvrir un fichier sans ouvrir le dialogue ?
    Par chacarre dans le forum Débuter
    Réponses: 2
    Dernier message: 24/04/2008, 18h34
  4. [Excel] ouvrir un fichier sans le voir à l'écran
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 10/01/2006, 15h04
  5. Automation excel - ouvrir un fichier sans classeur
    Par Celia1303 dans le forum Access
    Réponses: 3
    Dernier message: 23/11/2005, 20h23

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