Spring Grails文件下载

Spring Grails文件下载,spring,grails,download,http-headers,attachment,Spring,Grails,Download,Http Headers,Attachment,我正在尝试创建一个允许用户上传任何他们喜欢的文件类型的网站。我已经很好地实现了这个特性,文件保存在服务器上。稍后他们可以下载文件查看,但我很难让它正常工作。 我用过任何我能掌握的例子,但它们都倾向于使用文本文件作为例子。我的问题是pdf和许多其他文件类型没有正确下载。他们似乎下载得很好,但没有一个文件能成功打开。比较这些文件,似乎大多数文件的内容都是正确的,但某些部分是不正确的。 以下是我的groovy代码: def file = new File(params.fileDir) re

我正在尝试创建一个允许用户上传任何他们喜欢的文件类型的网站。我已经很好地实现了这个特性,文件保存在服务器上。稍后他们可以下载文件查看,但我很难让它正常工作。

我用过任何我能掌握的例子,但它们都倾向于使用文本文件作为例子。我的问题是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
def file=新文件(params.fileDir)
response.setContentType(“应用程序/八位字节流”)
response.setHeader(“内容处置”,“文件名=${file.getName()}”)

response.outputStream问题是您使用“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
def file=新文件(params.fileDir)
response.setContentType(“应用程序/八位字节流”)
setHeader(“内容处置”、“附件;文件名=${file.getName()}”)

回复。输出流很好,谢谢。我使用的是.text方法,但不知道它实际上在做什么-找不到任何文档:/n您可以在Groovy JDK中找到文档(Groovy对Java SDK的动态扩展的文档)。在本例中,调用的是java.io.File.getText()方法:有人知道如何将许多文件放入响应吗?有什么例子吗?你能告诉我params.fileDir是什么吗?确切值是多少?我也在尝试同样的事情,但我有一个字节数组,内容类型等存储在一个对象中,我需要把它放在下载的文件中。谢谢