2008-12-28 23 views
21

Estoy intentando crear un sitio que permita a los usuarios subir cualquier tipo de archivo que deseen. Implementé bien esta característica y el archivo se guarda en el servidor. Más tarde pueden descargar el archivo para verlo, pero estoy teniendo problemas para que funcione.

He utilizado algunos ejemplos que puedo encontrar pero todos tienden a usar archivos de texto como ejemplos. Mi problema es que el pdf y muchos otros tipos de archivos no se están descargando correctamente. Parecen descargar bien, pero ninguno de los archivos se abrirá correctamente. Comparando los archivos, parece que la mayoría del contenido de los archivos es correcto, pero ciertas partes no lo son.

Aquí está mi código maravilloso:Descarga de archivos de Grails

def file = new File(params.fileDir)  
response.setContentType("application/octet-stream") 
response.setHeader("Content-disposition", "filename=${file.getName()}") 
response.outputStream << file.text 
return 

Este código se lleva a cabo dentro de un controlador que es llamada por un enlace de descarga. He intentado jugar con diferentes contentTypes, pero no sé cuál podría usar para cualquier tipo, ¿hay alguno? Todo lo que intento no resuelve el problema.

Gracias por su ayuda.

Respuesta

41

El problema es que usted lee el contenido del archivo en una cadena usando "file.text". El contenido del archivo se convierte con la codificación de caracteres del sistema, incluso si el contenido es binario, no el texto (por ejemplo, los archivos PDF son binarios) y se envía al cliente utilizando la codificación de respuesta y modificando así el contenido binario. Más bien debería usar un enfoque diferente como este:

def file = new File(params.fileDir)  
response.setContentType("application/octet-stream") 
response.setHeader("Content-disposition", "attachment;filename=${file.getName()}") 

response.outputStream << file.newInputStream() // Performing a binary stream copy 
+0

Gracias. Estaba usando el método .text pero no sabía lo que estaba haciendo, no pude encontrar ninguna documentación en él:/ –

+0

Puede encontrar la documentación dentro de Groovy JDK (una documentación de las extensiones dinámicas del SDK de Java por Groovy). En este caso, se invoca el método java.io.File.getText(): http://groovy.codehaus.org/groovy-jdk/java/io/File.html#getText() –

+0

¿Alguien más? ¿Sabes cómo poner muchos archivos a la respuesta? Cualquier examen? –

Cuestiones relacionadas