Actualmente estoy haciendo un pequeño proyecto personal de visualización y descarga de tebeos, y del que en breve os espero hablar un poquito más.

Como framework, estoy usando gaelyk, que permite realizar aplicaciones en google app engine con Groovy de una manera muy rápida. Ayer finalicé el módulo de descarga de comics en formato .cbz., y me parece interesante enseñar con qué pocas líneas podemos generar un fichero zip y cómo podemos hacer que un servlet lo escupa por la salida estándar.

Pese a que el ejemplo es con un Groovlet, est fácilmente exportable a un servlet:

import util.*; //Paquete de mi aplicación
import java.util.zip.*;

def reader = new SMReader();
def images = reader.getImages3(params.urlOrigen) //images tiene una lista de urls de imágenes a descargar
def tokens = params.name.tokenize("/")
def name =  tokens[0].replaceAll("_", " ")
def chapter = tokens[1]

def os = response.getOutputStream() //Obtenemos el ouptutStream del response...
def zos = new ZipOutputStream(os) //Y se lo pasamos a nuestro zipOutputStream

response.setContentType 'application/zip' //El contenido a mostrar es un fichero comprimido
response.setHeader "Content-Disposition", "attachment; filename=" + name + ' ' + chapter + '.cbz'; //Vamos a enviar un attachment, con el nombre dado

//Obtendremos los bytes de cada imagen, siendo cada una de ellas una entrada de nuestro fichero zip (de la 0001.jpg hasta la XXXX.jpg)
images.eachWithIndex{ image, index ->
	zos.putNextEntry(new ZipEntry((index+1).toString().padLeft(4,'0') + '.jpg')) //Creamos la entrada y le damos nombre
	try{
		def bytes = new URL(image).getBytes()
		zos.write(bytes, 0, bytes.size()) //Escribimos los bytes de la imagen en la entrada
	} catch(Exception e) {}
	zos.closeEntry() //Cerramos la entrada
}

zos.flush() //Escribimos los bytes en el stream
zos.close() //Cerramos el zipOutputStream

Podemos ver que la creación de ficheros comprimidos con java es algo bastante sencillo al proporcionarnos la librería estándar de las clases necesarias para crearlos y trabajar con ellos.

Fuentes:

Anuncios