2011-04-01 12 views
5

Tengo un ZipOutputStream que quiero devolver al navegador. La experiencia que me gustaría es que el usuario haga clic en una etiqueta de anclaje, y luego se muestra un mensaje de descarga de archivo para el ZipOutputStream que tengo.Volviendo ZipOutputStream al navegador

¿Cómo se devuelve ZipOutputStream al navegador?

Respuesta

12

Simplemente tenía que hacer exactamente lo mismo ayer.

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    ZipOutputStream zip = new ZipOutputStream(baos); 

    .... populate ZipOutputStream 

    String filename = "out.zip"; 
    // the response variable is just a standard HttpServletResponse 
    response.setHeader("Content-Disposition","attachment; filename=\"" + filename + "\""); 
    response.setContentType("application/zip"); 

    try{    
     response.getOutputStream().write(baos.toByteArray()); 
     response.flushBuffer(); 
    } 
    catch (IOException e){ 
     e.printStackTrace();   
    } 
    finally{ 
     baos.close(); 
    } 

Nota que estoy usando un envoltorio ByteArrayOutputStream y toByteArray pero probablemente podría simplemente escribir cualquier otro tipo de flujoSalida directamente a la respuesta con un bucle estándar InputStream.read() OutputStream.write().

No estoy seguro de cuál es el más rápido, pero sospecho que el uso de ByteArrayOutputStream aquí podría no ser el enfoque más consciente de la memoria: