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:
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 dentré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 dun buffer de sortie afin daméliorer les perf décriture
BufferedOutputStream buff = new BufferedOutputStream(dest);
// Création dun 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 dentré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 dentrée et de sortie
int count;
while((count = buffi.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
//Fermeture de lentrée en cours
out.closeEntry();
//Fermeture des flux
buffi.close();
}
out.close(); |
J'ai créé une page JSP comprenant ceci:
Code:
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.... :roll:
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 :)