spillo491
27-01-2011, 09:07
Ciao a tutti ho un problema nello zippare un file xls e mandarlo sull'outputstream !
La funzione di creazione zip sembra corretta perchè se salvo lo zip (a.zip) e lo scompatto mi estrae il mio file xls (b.xls) che openoffice mi riconosce . Se però invece di salvare il file a.zip faccio direttamente apri, winrar mi fa vedere un file b.xls ma con l'icona di uno zip.
Stessa cosa se faccio doppioclick sul file zip salvato.
Se clicco sopra questo b.xsl con l'icona di uno zip, mi apre il mio fle xls ma esce un avviso del tipo
"b.xls will be compressed only after closing the application using it"
Dipende dal contenttype settato sulla response ?
Ecco la mia funzione createZip
public static String createZip( String fileName ){
File f = new File( fileName );
//String zipFileName = fileName + ".zip";
fileName = fileName.substring(0, fileName.indexOf("."));
String zipFileName = fileName + ".zip";
File fZip = new File( zipFileName );
ZipOutputStream zos = null;
BufferedInputStream bis = null;
boolean hasError = false;
try {
zos = new ZipOutputStream( new BufferedOutputStream( new FileOutputStream( fZip ) ) );
zos.setLevel( Deflater.DEFAULT_COMPRESSION );
zos.putNextEntry( new ZipEntry( f.getName() ) );
bis = new BufferedInputStream( new FileInputStream( f ) );
byte[] buffer = new byte[8192];
int read = 0;
while ( ( read = bis.read( buffer ) ) > 0 ) {
zos.write( buffer, 0, read );
}
bis.close();
bis = null;
zos.closeEntry();
zos.close();
zos = null;
}
catch ( Exception e ) {
cat.error( "createZip:" + e.getMessage() );
hasError = true;
}
finally {
if ( bis != null ) try { bis.close(); } catch ( Exception ex ) {}
if ( zos != null ) try { zos.close(); } catch ( Exception ex ) {}
if ( hasError ) {
fZip.delete();
}
}
return zipFileName;
}
e come la chiamo
try {
//nome del file zip effettivamente visualizzato dall'utente
String userFileName = "ZIP_" + Utility.d2HMSM( new java.util.Date() ) + ".zip";
// zippo il file con estensione
String zipFileName = Utility.createZip(fileName);
// Mando il file zip sull'outputstream
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment; filename=\"" + userFileName + "\"");
fileZip = new File( zipFileName );
fis = new FileInputStream( fileZip );
OutputStream os = response.getOutputStream();
byte[] buffer = new byte[8192];
int read = 0;
while( ( read = fis.read( buffer, 0, 8192 ) ) > 0 ) {
os.write( buffer, 0, read );
}
os.close();
}
finally {
if ( is != null ) try { is.close(); } catch ( Exception e1 ) {}
fileZip.delete();
fis.close();
}
Grazie
La funzione di creazione zip sembra corretta perchè se salvo lo zip (a.zip) e lo scompatto mi estrae il mio file xls (b.xls) che openoffice mi riconosce . Se però invece di salvare il file a.zip faccio direttamente apri, winrar mi fa vedere un file b.xls ma con l'icona di uno zip.
Stessa cosa se faccio doppioclick sul file zip salvato.
Se clicco sopra questo b.xsl con l'icona di uno zip, mi apre il mio fle xls ma esce un avviso del tipo
"b.xls will be compressed only after closing the application using it"
Dipende dal contenttype settato sulla response ?
Ecco la mia funzione createZip
public static String createZip( String fileName ){
File f = new File( fileName );
//String zipFileName = fileName + ".zip";
fileName = fileName.substring(0, fileName.indexOf("."));
String zipFileName = fileName + ".zip";
File fZip = new File( zipFileName );
ZipOutputStream zos = null;
BufferedInputStream bis = null;
boolean hasError = false;
try {
zos = new ZipOutputStream( new BufferedOutputStream( new FileOutputStream( fZip ) ) );
zos.setLevel( Deflater.DEFAULT_COMPRESSION );
zos.putNextEntry( new ZipEntry( f.getName() ) );
bis = new BufferedInputStream( new FileInputStream( f ) );
byte[] buffer = new byte[8192];
int read = 0;
while ( ( read = bis.read( buffer ) ) > 0 ) {
zos.write( buffer, 0, read );
}
bis.close();
bis = null;
zos.closeEntry();
zos.close();
zos = null;
}
catch ( Exception e ) {
cat.error( "createZip:" + e.getMessage() );
hasError = true;
}
finally {
if ( bis != null ) try { bis.close(); } catch ( Exception ex ) {}
if ( zos != null ) try { zos.close(); } catch ( Exception ex ) {}
if ( hasError ) {
fZip.delete();
}
}
return zipFileName;
}
e come la chiamo
try {
//nome del file zip effettivamente visualizzato dall'utente
String userFileName = "ZIP_" + Utility.d2HMSM( new java.util.Date() ) + ".zip";
// zippo il file con estensione
String zipFileName = Utility.createZip(fileName);
// Mando il file zip sull'outputstream
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment; filename=\"" + userFileName + "\"");
fileZip = new File( zipFileName );
fis = new FileInputStream( fileZip );
OutputStream os = response.getOutputStream();
byte[] buffer = new byte[8192];
int read = 0;
while( ( read = fis.read( buffer, 0, 8192 ) ) > 0 ) {
os.write( buffer, 0, read );
}
os.close();
}
finally {
if ( is != null ) try { is.close(); } catch ( Exception e1 ) {}
fileZip.delete();
fis.close();
}
Grazie