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 :

Génération "à la volée" / Prob sur les flux de données


Sujet :

Servlets/JSP Java

  1. #1
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Points : 120
    Points
    120
    Par défaut Génération "à la volée" / Prob sur les flux de données
    Bonjour,

    J'aimerais proposer une fonctionnalité de sélection de fichier, puis après validation, de générer un zip de ces fichiers, et de proposer cela directement en téléchargement, de façon automatique, cad, sans que l'internaute n'ait à cliquer sur un lien. Le fichier ne doit pas non plus être stocké (mis à part en mémoire, le tps que l'utilisateur le télécharge.

    En gros, le but est donc:

    1. selection
    2. Fenêtre du navigateur (ouvrir ou telecharger)

    Actuellement, le zip généré est enregistré sur le DD du serveur. le script est ainsi:
    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
    44
    45
     
    // Création du tampon pour les buffers d’entrée et de sortie 
                	final int BUFFER = 2048;
                	byte data[] = new byte[BUFFER];
     
                	// Création aléatoire du nom de l'archive....
                	Random rnd = new Random( );
                	String fichier = String.valueOf(rnd.nextLong());
     
                	// Création du flux d’écriture vers le fichier
                	FileOutputStream dest = new FileOutputStream(GlobalConst.PATH_APPLI + File.separator + GlobalConst.REP_ZIP + File.separator + fichier +".zip");
     
                	// Création d’un buffer de sortie afin d’améliorer les perf d’écriture
                	BufferedOutputStream buff = new BufferedOutputStream(dest);
     
                	// Création d’un flux d’écriture Zip vers ce fichier à travers le buffer
                	ZipOutputStream out = new ZipOutputStream(buff);
     
                	// On donne la méthode de compression désirée (ici DEFLATE), et le tx de compression (on n'aura que des images, donc peu de compression
                	out.setMethod(ZipOutputStream.DEFLATED);
                	out.setLevel(5);
     
                	// Les fichiers à compresser...
                	for(int i=0; i<l_nomPhotos.size(); i++) {
                		FileInputStream fi = new FileInputStream(GlobalConst.PATH_APPLI + File.separator + GlobalConst.REP_PHOTO + File.separator +l_nomPhotos.get(i));
     
                		//Création de leur buffer d’entrée
                		BufferedInputStream buffi = new BufferedInputStream(fi, BUFFER);
                		// Création d'une entrée zip pour chacun
                		ZipEntry entry = new ZipEntry(l_nomPhotos.get(i).toString());
                		// Affectation de cette entrée au flux zip de sortie
                		out.putNextEntry(entry);
                		//Écriture des entrées dans le flux de sortie par paquet de taille égale aux tampons d’entrée et de sortie
                		int count;
                		while((count = buffi.read(data, 0, BUFFER)) != -1) {
                			out.write(data, 0, count);
                		}
     
                		//Fermeture de l’entrée en cours
                		out.closeEntry();
                		//Fermeture des flux
                		buffi.close();
                	}
     
                	out.close();


    J'ai créé une page JSP comprenant ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    <%
        response.setContentType("application/zip");
        response.setHeader("Content-Disposition", "attachment; filename=monfichier.zip");
     %>
    Cela a pour action que le navigateur me propose bien de télécharger ce fichier.
    Mon seul problème est: comment faire en sorte que "monfichier.zip" pointe vers le flux, (vers le "fichier") sans que celui-ci ne soit enregistré....
    De plus, pour supprimer l'enregistrement du fichier, j'ai pensé supprimer le FileOutPutStream pour le remplacer par un OutPutStream, mais je me heurte tjs à un problème à un moment ou à un autre, alors je me dit que je ne suis peut être pas sur la bonne voie....

    J'ai trouvé pas mal d'éléments, notamment sur les PDF, mais je n'ai pour le moment, soit pas bien saisi la chose, soit pas trouvé ce qui me correspondait, soit pas bien compris...

    Je sais que je ne suis pas loin...
    Merci d'avance de votre aide

  2. #2
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Points : 120
    Points
    120
    Par défaut
    J'ai un peu avancé ^^
    Avant de tester (ça va prendre un peu de temps car, il faut que modifie quelques petits trucs...), je poste le code

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    public ActionForward getZip(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
    			throws Exception {
     
        	DynaActionForm l_form = (DynaActionForm)form;
     
        	 response.setContentType("application/zip");
        	 //response.setHeader("Content-Disposition", "attachment; filename=ddd.pdf");
     
        	 List l_nomPhotos = new ArrayList();
     
       		final int BUFFER = 2048;
           	byte data[] = new byte[BUFFER];
     
            	// Création aléatoire du nom de l'archive....
            	Random rnd = new Random( );
            	String fichier = String.valueOf(rnd.nextLong());
     
            	// Création/récupération du flux d’écriture vers le fichier
            	OutputStream dest = response.getOutputStream(); 
     
            	// Création d’un buffer de sortie afin d’améliorer les perf d’écriture
            	BufferedOutputStream buff = new BufferedOutputStream(dest);
     
            	// Création d’un flux d’écriture Zip vers ce fichier à travers le buffer
            	ZipOutputStream out = new ZipOutputStream(buff);
     
            	// On donne la méthode de compression désirée (ici DEFLATE), et le tx de compression (on n'aura que des images, donc peu de compression
            	out.setMethod(ZipOutputStream.DEFLATED);
            	out.setLevel(5);
     
            	// Les fichiers à compresser...
            	for(int i=0; i<l_nomPhotos.size(); i++) {
            		FileInputStream fi = new FileInputStream(GlobalConst.PATH_APPLI + File.separator + GlobalConst.REP_PHOTO + File.separator +l_nomPhotos.get(i));
     
            		//Création de leur buffer d’entrée
            		BufferedInputStream buffi = new BufferedInputStream(fi, BUFFER);
            		// Création d'une entrée zip pour chacun
            		ZipEntry entry = new ZipEntry(l_nomPhotos.get(i).toString());
            		// Affectation de cette entrée au flux zip de sortie
            		out.putNextEntry(entry);
            		//Écriture des entrées dans le flux de sortie par paquet de taille égale aux tampons d’entrée et de sortie
            		int count;
            		while((count = buffi.read(data, 0, BUFFER)) != -1) {
            			out.write(data, 0, count);
            		}
     
            		//Fermeture de l’entrée en cours
            		out.closeEntry();
            		//Fermeture des flux
            		buffi.close();
            	}
     
            	out.close();
     
    		// Calculer le flux à renvoyer au client
    		byte[] bytes = out.toString().getBytes();
     
    		// Envoyer le flux dans la réponse
    		OutputStream os = response.getOutputStream();
    		os.write(bytes);
    		os.close();
     
    		// Retourne null pour dire à Struts de ne rien faire
    		return null;
    	}

  3. #3
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Points : 120
    Points
    120
    Par défaut
    Pour info, pour ceux que cela intéresse, ça marche

Discussions similaires

  1. [RSS] Questions diverses sur les flux RSS (Google et phpBB)
    Par leserapheen dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 06/10/2006, 14h35
  2. comment ecrire en arabe sur les basse de données
    Par infocher dans le forum Bases de données
    Réponses: 3
    Dernier message: 11/01/2006, 16h03
  3. prob sur les CString s
    Par xbabilone dans le forum MFC
    Réponses: 3
    Dernier message: 02/01/2006, 23h54
  4. Livre gratuit sur les bases de données...
    Par benby dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 26/05/2005, 12h24

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