2008-12-28 7 views
21

J'essaie de craeted un site qui permet aux utilisateurs de télécharger n'importe quel type de fichier qu'ils aiment. J'ai implémenté cette fonctionnalité très bien et le fichier est conservé sur le serveur. Plus tard, ils peuvent télécharger le fichier à afficher, mais j'ai du mal à le faire fonctionner.

J'ai utilisé tous les exemples que je peux trouver, mais ils ont tous tendance à utiliser des fichiers texte comme exemples. Mon problème est que pdf et beaucoup d'autres types de fichiers ne téléchargent pas correctement. Ils semblent télécharger très bien, mais aucun des fichiers s'ouvrira avec succès. En comparant les fichiers, il semble que la plupart du contenu des fichiers est correct, mais certaines parties ne le sont pas.

Voici mon code groovy:Grails File Télécharger

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

Ce code est maintenu à l'intérieur d'un contrôleur qui est appelé par un lien de téléchargement. J'ai essayé de jouer avec des contentTypes différents, mais je ne sais pas lequel je pourrais utiliser pour n'importe quel type - y en a-t-il un? Tout ce que j'essaie ne résout pas le problème.

Merci pour votre aide.

Répondre

41

Le problème est que vous lisez le contenu du fichier dans une chaîne en utilisant "file.text". Le contenu du fichier est converti avec le codage de caractères système même si le contenu est binaire, et non du texte (par exemple, les fichiers PDF sont binaires) et envoyé au client en utilisant le codage de réponse et ainsi modifier le contenu binaire. Vous devriez plutôt utiliser une approche différente comme ceci:

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

Nice merci. J'utilisais la méthode .text mais je ne savais pas ce qu'il faisait réellement - je n'ai trouvé aucune documentation dessus:/ –

+0

Vous pouvez trouver la documentation dans le JDK de Groovy (une documentation des extensions dynamiques du Java SDK par Sensationnel). Dans ce cas, c'est la méthode java.io.File.getText() qui est invoquée: http://groovy.codehaus.org/groovy-jdk/java/io/File.html#getText() –

+0

savoir comment mettre beaucoup de fichiers à la réponse? Des exemples? –