Si bien es cierto que es más común escribir un archivo adjunto binario utilizando un servlet en lugar de un jsp, sin duda es posible escribir un archivo adjunto binario de un jsp. Y la ventaja de hacerlo es que no necesita preocuparse por configurar web.xml o volver a cargar su aplicación. Esa puede ser una consideración importante, dependiendo del entorno de su servidor web.
Aquí hay un jsp de ejemplo que usa poi para enviar un archivo adjunto binario a un navegador.
<%@page import="org.apache.poi.hssf.usermodel.*" %><%@page import="java.io.*" %><%
// create a small spreadsheet
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
HSSFRow row = sheet.createRow(0);
HSSFCell cell = row.createCell(0);
cell.setCellValue("Some text");
// write it as an excel attachment
ByteArrayOutputStream outByteStream = new ByteArrayOutputStream();
wb.write(outByteStream);
byte [] outArray = outByteStream.toByteArray();
response.setContentType("application/ms-excel");
response.setContentLength(outArray.length);
response.setHeader("Expires:", "0"); // eliminates browser caching
response.setHeader("Content-Disposition", "attachment; filename=testxls.xls");
OutputStream outStream = response.getOutputStream();
outStream.write(outArray);
outStream.flush();
%>
El truco importante es asegurarse de que sólo hay una línea con todas sus importaciones y otras directivas anteriores a la "<%" que comienza su código. De lo contrario, jsp puede generar algunas nuevas líneas iniciales y dañar su resultado.
Además, le sugiero que siempre configure la longitud del contenido. Algunos navegadores no funcionarán correctamente si no está configurado. Es por eso que primero envío mi hoja de cálculo a una matriz de bytes, por lo que podría establecer la longitud antes de enviar los datos.
writableworkbook es parte de la api jexcel ¿verdad? esto debería funcionar incluso si estoy usando poi ¿verdad? – user571099
@ user571099 el libro de trabajo es un 'HSSFWorkbook' aquí, no un' WritableWorkbook'. –
¡Esto era exactamente lo que estaba buscando! Supongo que esto se puede hacer de manera similar con el servicio web RESTful de Jersey. – Brian