grails - 下载PDF获取空文件

时间:2014-11-19 15:22:43

标签: mysql grails pdf download

我在mysql数据库中存储了一些文件。相应的域类如下所示:

import org.springframework.web.multipart.commons.CommonsMultipartFile
import grails.persistence.Entity

@Entity
class Document extends BaseClass {

    String documentReference
    CommonsMultipartFile cmfFile

    static constraints = {
        documentReference nullable: true, maxSize: 500
    }

    static mapping = {
        cmfFile sqlType: "mediumblob"
    }
}

我成功地在数据库中的表中成功存储了不同的文件。现在,我想让用户使用以下操作下载任何这些文件:

def download(Document documentInstance) {
    if (documentInstance == null) {
        notFound()
        return
    }

    response.setContentType(documentInstance?.cmfFile?.contentType)
    response.setHeader("Content-disposition", "attachment;filename=${documentInstance?.cmfFile?.originalFilename}")
    response.outputStream << documentInstance?.cmfFile?.getBytes()
    response.outputStream.flush()
    return true 
}

我现在的问题是下载与.docx,文本文件或图片完美搭配。但是,当我试图下载例如.pdf或.zip所有文件都是空的。我不知道有什么不同,因为我也传递了内容类型。

我会很乐意为你提供帮助!谢谢!

1 个答案:

答案 0 :(得分:1)

我也使用Grails(2.3.11),我在MySQL中存储文件,它就像一个魅力。

我能看到的差异是:

我使用Blob类型代替CommonsMultipartFiletype: 'blob'代替sqlType: 'mediumblob'。要将值设置为此类字段,您可以使用new javax.sql.rowset.serial.SerialBlob(byte[])

控制器

我使用(根据您的命名调整):

response.setContentType(servletContext.getMimeType(documentInstance?.cmfFile?.originalFilename))
response.setHeader("Content-disposition", "inline;filename=${documentInstance?.cmfFile?.originalFilename}")
response.outputStream << documentInstance?.cmfFile?.getBytes()

flush(),没有return true

注释

我还注意到你使用了很小的maxSize约束。 500 B不是太多。你确定它对你的PDF或ZIP足够了吗?

此外,你确定documentInstance?.cmfFile不是空的吗?