grails,如何强制浏览器下载文件

Joh*_*tle 1 grails download

在控制器中,我这样做是为了尝试在用户单击链接时让浏览器下载文件:

    render( contentType: 'text/csv', text: output);
Run Code Online (Sandbox Code Playgroud)

这在 Chrome 中有效,但在 IE 或 safari 中不起作用,它们只显示数据。此外,它还将文件名显示为数字(恰好是 url 上的 Id,例如 www.me.com/show/1

显然。修复下载的方法是转换为八位字节流。这可以在 htaccess 文件中完成,但我不使用 apache。在grails中有什么方法可以做到这一点吗?我想这是一个常见的场景。

在 php 中,人们可能会这样做:

  header('Content-Disposition: attachment; filename="downloaded.csv"');
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

阅读下面的两个回复后(谢谢!),这有效:

response.setHeader "Content-disposition", "attachment; filename=report.csv"
    response.contentType = 'text/csv'
    response.outputStream << output
    response.outputStream.flush()
Run Code Online (Sandbox Code Playgroud)

令人惊奇的是,我可以获取一个字符串并使用 << 将其写入输出流。我打算尝试找出如何将字符串变成流的形式。

dan*_*lad 5

class DownloadController {
    def download(long id) {
        Document documentInstance = Document.get(id)
        if ( documentInstance == null) {
            flash.message = "Document not found."
            redirect (action:'list')
        } else {
            response.setContentType("APPLICATION/OCTET-STREAM")
            response.setHeader("Content-Disposition", "Attachment;Filename=\"${documentInstance.filename}\"")

            def outputStream = response.getOutputStream()
            outputStream << documentInstance.filedata
            outputStream.flush()
            outputStream.close()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请参阅此网站了解更多信息