Grails文件下载

22

我正在尝试创建一个允许用户上传任何文件类型的网站。我已经成功实现了这个功能,并将文件保存在服务器上。但是,当他们稍后想要下载文件查看时,我遇到了一些问题。

我使用了我能找到的所有示例,但它们都倾向于以文本文件作为示例。我的问题是,PDF和许多其他文件类型不能正常下载。它们似乎可以正常下载,但是没有一个文件能够成功打开。比较这些文件,似乎大多数文件内容是正确的,但某些部分不正确。

这是我的Groovy代码:

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

这段代码包含在由下载链接调用的控制器中。 我尝试使用不同的contentTypes进行尝试,但是我不知道我能为任何类型使用哪种 - 是否有一种通用的contentType?无论我尝试什么都不能解决问题。

感谢您的帮助。

1个回答

41

问题在于您使用"file.text"将文件内容读入字符串。即使内容是二进制而不是文本(例如,PDF文件是二进制的),系统字符编码也会将文件内容转换并使用响应编码发送到客户端,从而修改二进制内容。您应该使用不同的方法,比如这样:

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

太好了,谢谢。我一直在使用.text方法,但不知道它实际上在做什么——找不到任何文档 :/ - James Camfield
你可以在Groovy JDK(Java SDK的动态扩展文档)中找到文档。在这种情况下,调用的是java.io.File.getText()方法:http://groovy.codehaus.org/groovy-jdk/java/io/File.html#getText() - Siegfried Puchbauer
有人知道如何将多个文件放入响应中吗?有示例吗? - Eugene Hoza
你能告诉我params.fileDir是什么吗?确切的值是多少?我正在尝试相同的事情,但我有一个存储在对象中的字节数组、内容类型等需要放入下载文件中。谢谢! - usb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接