我在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所有文件都是空的。我不知道有什么不同,因为我也传递了内容类型。
我会很乐意为你提供帮助!谢谢!
答案 0 :(得分:1)
我也使用Grails(2.3.11),我在MySQL中存储文件,它就像一个魅力。
我能看到的差异是:
我使用Blob
类型代替CommonsMultipartFile
和type: '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
不是空的吗?