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

Servlets/JSP Java Discussion :

Enregistrer fichier à partir d'une servlet


Sujet :

Servlets/JSP Java

  1. #1
    Membre averti Avatar de coshibe
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 183
    Points : 397
    Points
    397
    Par défaut Enregistrer fichier à partir d'une servlet
    Bonjour à tous.

    Me voilà confronté à une tache à laquelle je n'avais pas encore pensée et qui pourtant semble plutot courante. Je gère grâce à une JSP une recherche d'information que j'aimerai restituer à l'utilisateur sous forme d'un fichier .dbf (ou .txt pour plus de simplicité). Gérer la recherche, créer le fichier aucun probleme, là ou je bloque c'est comment faire pour l'enregistrer sur le pc de l'utilisateur.

    Deux possibilités s'ouvrent à moi :
    -soit j'enregistre directement mon fichier dans le répertoire c:\FichierTemporaire\
    -soit je demande à l'utilisateur ou il veut l'enregistrer.

    ensuite l'autre question qui se pose est vais je créer le fichier sur mon serveur pour pouvoir l'envoyer? ou vais je écrire directement le fichier au fur et à mesure sur le pc du user?

    Mais dans les Deux cas je n'ai aucune idée de la marche à suivre, comment gérer ca via mes JSP/SERVLETS?


    J'attends impatiemment vos conseils.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Un petit lien vers la FAQ devrait faire l'affaire :
    http://javaweb.developpez.com/faq/ja...GEMENT_FICHIER

  3. #3
    Membre averti Avatar de coshibe
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 183
    Points : 397
    Points
    397
    Par défaut
    Je me permets de reformuler mon probleme :
    J'ai créé un fichier fich.dbf sur mon serveur dont j'ai récupéré le chemin CH1. Je voudrai ensuite envoyer ce fichier chez le l'user via la servlet dans le dossier "C:\FichierTemporaire\"

    Je me permets de reposter l'exemple de la FAQ :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    response.setContentType("application/download");
    response.setHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");
     
    ServletOutputStream out = response.getOutputStream();
    File file = null;
    BufferedInputStream from = null; 
    try { 
    	//dans mon cas le filepath et le path complet après création
    	// d'un temp file 
    	file = new File(filepath);
    	response.setContentLength((int) file.length()); 
    	int bufferSize = 64 * 1024;
    	long time = System.currentTimeMillis();
     
    	try {
    		from = new BufferedInputStream(new FileInputStream(file), bufferSize * 2);
    		byte[] bufferFile = new byte[bufferSize];
    		for (int i = 0; ; i++) {
    			int len = from.read(bufferFile); 
    			if (len < 0) break; 
    			out.write(bufferFile, 0, len);
    		}
    		out.flush();
    	} finally { 
    		try { 
    			from.close();
    		} catch (Exception e) { } 
    		try { 
    			out.close();
    		} catch (Exception e) {} 
    	} 
    	time = (System.currentTimeMillis() - time) / 1000; 
    	// seconds download 
    	double kb = (file.length() * 1.0 / 1024);
     
    	if (file != null) file.delete(); 
    } catch (Exception e) {
    	return; 
    } finally { 
    	try { 
    		file.delete();
    	} catch (Exception ex) {}
    }
    Je ne comprends pas plusieurs points :

    Pourquoi utiliser un buffer?
    Aquoi sert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long time = System.currentTimeMillis();
    ?
    Ou vais je mettre l'adresse d'origine du fichier et ou vais je mettre l'adresse de destination?

    Excusez moi si ca vous parait basique mais je ne trouve pas beaucoup de documentation sur ce genre de manipulations.

  4. #4
    Membre averti Avatar de coshibe
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 183
    Points : 397
    Points
    397
    Par défaut
    J'ai éditer mon message précédent en précisant mes questions. Donc petit up.

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Le buffer sert à accélérer la lecture du fichier.

    La variable time est utilisée pour calculer le temps passé à la lecture / ecriture.

    filepath doit contenir le chemin du fichier source.

    Le chemin du fichier de destination sera demandé à l'ouverture de la popup de sauvegarde par ton navigateur.

  6. #6
    Membre averti Avatar de coshibe
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 183
    Points : 397
    Points
    397
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Le buffer sert à accélérer la lecture du fichier.

    La variable time est utilisée pour calculer le temps passé à la lecture / ecriture.

    filepath doit contenir le chemin du fichier source.

    Le chemin du fichier de destination sera demandé à l'ouverture de la popup de sauvegarde par ton navigateur.
    Merci c'est beaucoup plus clair pour moi. Mais Loi de Murphy exige, une réponse à une question entraine 2 nouvelles questions.

    Concretement je peux me passer des variables? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    long time = System.currentTimeMillis();
    et
    double kb = (file.length() * 1.0 / 1024);
    Je suis donc entrain de m'atteler à la création d'un fichier. Toutefois je me rends compte que le FileWriter n'est pas tres judicieux parce que je ne peux pas préciser son adressage sur le serveur. Que me conseilleriez vous d'utiliser pour créer et traiter un fichier .txt?

    Et derniere question, j'ai donc créer une fonction sendResponse dans ma Servlet qui va s'occuper d'envoyer le fichier. Puis je ainsi envoyer plusieurs fichiers?

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Utilise le out, qui représente le flux envoyé vers le navigateur du client et qui pourra être sauvegardé par celui-ci.

    Oui tu peux te passer des variables qui ne servent pas.

    Tu ne pourras envoyer qu'un seul fichier à la fois.

  8. #8
    Membre averti Avatar de coshibe
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 183
    Points : 397
    Points
    397
    Par défaut
    Ne sachant pas trop comment utiliser le buffer j'ai fait sans.

    Tout marche à merveille, ne me reste plus qu'un probleme, j'ai besoin d'envoyer 2 fichiers à l'utilisateur. Voilà ce que je fais actuellement dans ma Servlet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.sendResponse(filename + "G.dbf", resp, fileChemin);
    						envoyerPage(ecran, req, resp);
    avec :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    public void sendResponse(String filename, HttpServletResponse resp, BaseChemin chemin) throws IOException
    	{
    		resp.setContentType("application/download");
    		resp.setHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");
     
    		ServletOutputStream out = resp.getOutputStream();
    		File file = null;
    		BufferedInputStream from = null;
    		try { 
    			file = new File(chemin.getNomRelatif());
    			resp.setContentLength((int) file.length()); 
    			int bufferSize = 64 * 1024;
     
    			try {
    				from = new BufferedInputStream(new FileInputStream(file), bufferSize * 2);
    				byte[] bufferFile = new byte[bufferSize];
    				for (int i = 0; ; i++) {
    					int len = from.read(bufferFile); 
    					if (len < 0) break; 
    					out.write(bufferFile, 0, len);
    				}
    				out.flush();
    			} finally { 
    				try { 
    					from.close();
    				} catch (Exception e) { } 
    				try { 
    					out.close();
    				} catch (Exception e) {} 
    			} 
     
    			if (file != null) file.delete(); 
    		} catch (Exception e) {
    			return; 
    		} finally { 
    			try { 
    				file.delete();
    			} catch (Exception ex) {}
    		}
    	}
    le probleme c'est que si je comprends bien à l'execution de sendResponse on en sort avec une exception donc forcement si j'en met un 2 à la suite ca n'ira pas.

    Que faire pour enregistrer 2 fichiers?

    edit : mes questions initiales étant résolues je me permets de créer un nouveau topic et de mettre celui ci en resolu.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/12/2011, 20h32
  2. lire un fichier .properties à partir d'une servlet
    Par air75 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 03/06/2009, 15h00
  3. redirection vers un fichier a partir d'une servlet
    Par air75 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 03/02/2008, 21h34
  4. Java/XML generer un fichier XML a partir d'une Servlet
    Par fabricew59 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 03/04/2007, 11h43
  5. [SERVLET]Appel d'un fichier à partir d'une servlet
    Par fchafia dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 17/03/2005, 12h21

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