Zipper des fichiers

Résolu/Fermé
Toinou87 Messages postés 28 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 8 août 2010 - 9 juil. 2009 à 14:07
Toinou87 Messages postés 28 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 8 août 2010 - 9 juil. 2009 à 15:39
Bonjour,
je dois recuperer des fichiers sur un serveur, les zipper, puis les envoyer sur la sortie en telechargement (java web pour info).

J'ai un code qui compile mais le fichier semble etre corrompu. Il fait la taille du premier fichier que je lui passe seulement et ni windows ni 7zip ne peuvent l'ouvrir.

Voici mon code, en esperant que quelqu'un pourra m'aider.
[code]
// These are the files to include in the ZIP file
List<String> filenames = down.getFilenames();
List<String> urls = down.getUrls();
byte data[] = new byte[1024];

try {
HttpClient client = new HttpClient();
// set default retry handler

client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler());

// Create the ZIP file
String outFilename = "outfile.zip";

FileOutputStream dest = new FileOutputStream(outFilename);
BufferedOutputStream buff = new BufferedOutputStream(dest);
ZipOutputStream out = new ZipOutputStream(buff);

out.setMethod(ZipOutputStream.DEFLATED);
out.setLevel(9);

// Compress the files
for (int i=0; i<filenames.size(); i++) {

//make an HTTP GET
HttpMethod method = new GetMethod(urls.get(i));
client.executeMethod(method);

InputStream is = method.getResponseBodyAsStream();

BufferedInputStream buffi=new BufferedInputStream(is,1024);

ZipEntry ze=new ZipEntry(filenames.get(i));

// Add ZIP entry to output stream.
out.putNextEntry(ze);

int count;
while((count = buffi.read(data, 0, 1024)) != -1) {
out.write(data, 0, count);
}

// Complete the entry
out.closeEntry();

buffi.close();

}
out.finish();
out.close();
String zip=buff.toString();

response.setContentType( "application/zip" );
response.setHeader( "Content-Disposition", "attachment; filename=\""+outFilename+"\"" );

ServletOutputStream op = response.getOutputStream();
op.println(zip);
op.flush();
/code
A voir également:

6 réponses

duff01 Messages postés 438 Date d'inscription mardi 7 juillet 2009 Statut Membre Dernière intervention 25 décembre 2010 71
9 juil. 2009 à 14:09
Si ton fichier est corrompu, tu ne peu pas le "récupérer" à moins de le retélécharger.
0
Toinou87 Messages postés 28 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 8 août 2010
9 juil. 2009 à 14:14
c'est le fichier telecharger qui est corrompu. le Zip.
J'ai tester, les fichiers recuperer du serveurs (pas zippés) fonctionnent tres bien
0
duff01 Messages postés 438 Date d'inscription mardi 7 juillet 2009 Statut Membre Dernière intervention 25 décembre 2010 71
9 juil. 2009 à 14:25
Et bien retélécharge se fichier, vu qu'il est corrompu, il est donc inutilisable. :)
0
Toinou87 Messages postés 28 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 8 août 2010
9 juil. 2009 à 14:35
tu comprends pas le code je crois.
Le fichier zip est generer en live avec les fichiers recuperer sur le serveur (tjs en live) puis envoyer sur la reponse. Et soit mon code genere mal le zip, soit il l'envoie mal sur la reponse.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Toinou87 Messages postés 28 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 8 août 2010
9 juil. 2009 à 14:50
Precision:
je viens d'ouvrir le zip generer avec notepad, c'est l'envoie sur la sortie qui plante.
Le toString() n'envoie pas les données mais le type de l'objet.
Donc le fichier generer est un fichier texte avec BufferedInputStream.

Le probleme est donc:
passer les données de out ou buff à op
0
Toinou87 Messages postés 28 Date d'inscription samedi 1 mars 2008 Statut Membre Dernière intervention 8 août 2010
9 juil. 2009 à 15:39
trouvé, j'utilise comme constructeur du buffered output stream le servlet output stream et ca marche (bon j'avais trouvé ca y a 30 min mais les fichiers du serveurs etaient perimés et ca me renvoyait des fichier vides).
Il reste peut etre des artefacts d'erreurs.

[code]
List<String> filenames = down.getFilenames();
List<String> urls = down.getUrls();
byte data[] = new byte[1024];

try {
HttpClient client = new HttpClient();
// set default retry handler

client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler());

BufferedInputStream buffi=null;

// Create the ZIP file
String outFilename = "outfile.zip";


response.setContentType( "application/zip" );
response.setHeader( "Content-Disposition", "attachment; filename=\""+outFilename+"\"" );
BufferedOutputStream buff = new BufferedOutputStream(response.getOutputStream());
ZipOutputStream out = new ZipOutputStream(buff);

out.setMethod(ZipOutputStream.DEFLATED);
out.setLevel(9);

// Compress the files
for (int i=0; i<filenames.size(); i++) {

//make an HTTP GET
HttpMethod method = new GetMethod(urls.get(i));
client.executeMethod(method);

InputStream is = method.getResponseBodyAsStream();

buffi=new BufferedInputStream(is,1024);

ZipEntry ze=new ZipEntry(filenames.get(i));

// Add ZIP entry to output stream.
out.putNextEntry(ze);

int count;
while((count = buffi.read(data, 0, 1024)) != -1) {
out.write(data, 0, count);
System.out.println(count);
}

// Complete the entry
out.closeEntry();

buffi.close();

}
out.finish();
out.close();


out.flush();
/code
0