Grails 文件下载

Posted

技术标签:

【中文标题】Grails 文件下载【英文标题】:Grails File Download 【发布时间】:2010-09-28 15:24:21 【问题描述】:

我正在尝试创建一个允许用户上传他们喜欢的任何文件类型的网站。我已经很好地实现了这个功能,并且文件保存在服务器上。稍后他们可以下载文件以查看,但我无法让它工作。 我使用了我能掌握的任何示例,但它们都倾向于使用文本文件作为示例。我的问题是 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,但我不知道我可以将哪个用于任何类型 - 有吗?我尝试的任何方法都不能解决问题。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

问题是您使用“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 方法,但不知道它实际上在做什么 - 找不到任何文档:/ 您可以在 Groovy JDK 中找到文档(Groovy 对 Java SDK 的动态扩展的文档)。在这种情况下,调用的是 java.io.File.getText() 方法:groovy.codehaus.org/groovy-jdk/java/io/File.html#getText() 有人知道如何将许多文件放入响应中吗?有什么例子吗? 你能告诉我 params.fileDir 是什么吗?确切的价值?我正在尝试同样的事情,但我有一个字节数组、内容类型等存储在我需要放入下载文件的对象中。谢谢!

以上是关于Grails 文件下载的主要内容,如果未能解决你的问题,请参考以下文章

在 Grails 中制作 WAR 文件

Grails 文件下载

Grails 文件上传 - 如何识别文件和/或内容类型?

Grails3文件上传maxFileSize限制

Grails 文件上传问题

Grails - 在哪里放置测试文件以及如何加载它们