Obligar al navegador a descargar un archivo docx en JAVA genera un documento corrupto

Usando JAVA, estoy tratando de forzar al navegador a descargar archivos.

Aquí está el código que uso actualmente:

response.reset();
response.resetBuffer();
response.setContentType(mimeType);
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

InputStream in = new FileInputStream(file);
OutputStream out = response.getOutputStream();
IOUtils.copy(in, out);

out.flush();
out.close();
in.close();
response.flushBuffer();

Funciona casi bueno, pero al forzar la descarga de un docx documento (MS Office 2007+), el archivo descargado está dañado (al menos, eso es lo que me dice MS Office). Si trato de abrirlo directamente en el servidor que los almacena, ese error no aparece, lo que significa que el problema si interfiere al descargar (y no al cargar).

Según IANA, el tipo MIME de dicho archivo debe ser application/vnd.openxmlformats-officedocument.wordprocessingml.document (1), pero especificar ese tipo MIME no resuelve el problema.

Existen varias pistas en la Web, pero ninguno de ellos funcionó para mí. Parece que hay un solución in ASP.NET, pero no encontré el equivalente en JAVA.

También traté de usar el tipo MIME application/vnd.ms-word (2) como vi ahí, pero el archivo descargado aún está dañado. Ídem para el tipo MIME application/msword (3) un chico sugirió aquí, y para el tipo MIME genérico application/octet-stream (4) como se presentó en este foro.

Luego, para cada uno de estos cuatro tipos MIME, traté de cambiar el nombre del archivo descargado de myfile.docx a myfile.doc (no x más), pero el problema persiste.

Entonces, ¿cómo forzar la descarga de un incorrupto cuando se descarga docx ¿Archivo? ¿Es correcto mi fragmento de código?

preguntado el 03 de mayo de 12 a las 13:05

Debe tener algo que no funciona en el servlet que devuelve el archivo porque tengo una aplicación web que devuelve docX durante años y nunca tuve ningún problema para descargar el archivo. Siempre puede cambiar el nombre de su *.docx en *.zip y ver si el contenido del archivo zip está dañado o no. -

@GuillaumePolet Acabo de intentar cambiar el nombre del archivo myfile.zip, subirlo y descargarlo: el archivo no está dañado. Al cambiar el nombre del archivo descargado myfile.docx, el problema vuelve a aparecer. ¿Qué tipo de MIME usaste? ¿Cambió el nombre de su archivo de *.docx a *.doc? -

El tipo de contenido se establece en 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' (sin las comillas simples). Los archivos terminan en .docx. Tal vez considere publicar su código completo de su servlet doPOst/doGet -

1 Respuestas

Intenté por casualidad agregar más encabezados y, de hecho, el Content-Length el encabezado resolvió el problema...

Finalmente, agrego esta línea para que funcione:

response.setContentLength((int) file.length());

Respondido 28 Abr '14, 12:04

SO no es como todos esos otros sitios, y a veces provoca que la gente diga que es un foro. En cualquier caso, me alegra saber que pudo resolver su propio problema. Asegúrese de marcarlo como resuelto en aproximadamente 48 horas. - Makoto

@sp00m ¿cuál era su tipo de contenido? - P-RAD

@P-RAD application/vnd.openxmlformats-officedocument.wordprocessingml.document - sp00m

@ sp00m gracias por la información, no puedo hacerlo funcionar. ¡pero agregar un atributo de descarga en el marcado funcionó! (w3.org/TR/html5/links.html) - P-RAD

@ sp00m Podría hacerlo funcionar gracias a la solución sugerida por usted. Probé muchas sugerencias enumeradas en varias preguntas de stackoverflow. Nada ayudó, pero tu respuesta sí. ¡Estoy en deuda contigo, querido programador! - coder

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.