22

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

我使用了我能掌握的任何示例,但它们都倾向于使用文本文件作为示例。我的问题是 pdf 和许多其他文件类型无法正确下载。他们似乎下载得很好,但没有一个文件可以成功打开。比较文件,似乎大部分文件内容是正确的,但某些部分不是。

这是我的常规代码:

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

此代码保存在由下载链接调用的控制器中。我尝试过使用不同的 contentTypes,但我不知道我可以将哪个用于任何类型 - 有吗?我尝试的任何事情都不能解决问题。

谢谢你的帮助。

4

1 回答 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
于 2008-12-28T22:32:43.657 回答