Mon application reçoit un courrier électronique via un serveur SMTP. L'e-mail contient une ou plusieurs pièces jointes renvoyées sous forme d'octet [] (avec Sun javamail api).
J'essaie de compresser les fichiers joints à la volée sans les écrire au préalable sur le disque.
Quel est/quels sont les moyens possibles pour atteindre ce résultat?
Vous pouvez utiliser Java.util.Zip.ZipOutputStream de Java pour créer un fichier Zip en mémoire. Par exemple:
public static byte[] zipBytes(String filename, byte[] input) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(baos);
ZipEntry entry = new ZipEntry(filename);
entry.setSize(input.length);
zos.putNextEntry(entry);
zos.write(input);
zos.closeEntry();
zos.close();
return baos.toByteArray();
}
Peut-être que le fichier Java.util.Zip package pourrait vous aider
Puisque vous demandez comment convertir un tableau d'octets, je pense (non testé), vous pouvez utiliser la méthode ByteArrayInputStream
int read(byte[] b, int off, int len)
Reads up to len bytes of data into an array of bytes from this input stream.
que tu nourriras à
ZipInputStream This class implements an input stream filter for reading files in the Zip file format.
J'ai le même problème mais il me fallait plusieurs fichiers dans un fichier Zip.
protected byte[] listBytesToZip(Map<String, byte[]> mapReporte, String extension) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(baos);
for (Entry<String, byte[]> reporte : mapReporte.entrySet()) {
ZipEntry entry = new ZipEntry(reporte.getKey() + extension);
entry.setSize(reporte.getValue().length);
zos.putNextEntry(entry);
zos.write(reporte.getValue());
}
zos.closeEntry();
zos.close();
return baos.toByteArray();
}
Vous pouvez créer un fichier Zip à partir d'un tableau d'octets et revenir à l'interface utilisateur streamedContent
public StreamedContent getXMLFile() {
try {
byte[] blobFromDB= null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(baos);
String fileName= "fileName";
ZipEntry entry = new ZipEntry(fileName+".xml");
entry.setSize(byteArray.length);
zos.putNextEntry(entry);
zos.write(byteArray);
zos.closeEntry();
zos.close();
InputStream is = new ByteArrayInputStream(baos.toByteArray());
StreamedContent zipedFile= new DefaultStreamedContent(is, "application/Zip", fileName+".Zip", Charsets.UTF_8.name());
return fileDownload;
} catch (IOException e) {
LOG.error("IOException e:{} ",e.getMessage());
} catch (Exception ex) {
LOG.error("Exception ex:{} ",ex.getMessage());
}
}
Vous devez utiliser un ZipOutputStream pour cela.
http://Java.Sun.com/javase/6/docs/api/Java/util/Zip/ZipOutputStream.html