将大文件(> 1GB)上传到grails3

时间:2018-01-09 08:08:15

标签: grails upload interceptor grails3

将大文件(> 1GB)上传到grails,我只需要通过流访问它,无需将整个文件保存到磁盘或RAM。但是,我如何访问上传流?我试过拦截器:

class UploadLargeFileInterceptor {

int order = HIGHEST_PRECEDENCE

UploadLargeFileInterceptor() {
    match(controller:"apiv2", action:"uploadLarge")
}

boolean before() {

    log.error('before')
    log.error(request.getInputStream().text.length() as String)
    true
}

boolean after() {

    log.error('after')
    true
}

void afterView() {
    // no-op
}
}

但是流长度始终为0,并且在控制器中有一个我要避免的多部分文件,因为它将存储整个文件。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

不需要拦截器。您可以在控制器内访问用户上传的文件流:

MultipartFile uploadedFile = params.filename as MultipartFile
println "file original name" + uploadedFile.originalFilename
println "file content type" + uploadedFile.contentType
println "file size" + uploadedFile.size //consider as stream length
InputStream inputStream = uploadedFile.getInputStream() //access the input stream

同时确保允许application.groovy中的最大尺寸:

grails.controllers.upload.maxFileSize = 1572864000 //1500MB (X MB * 1024 * 1024)
grails.controllers.upload.maxRequestSize = 1572864000 //1500MB

或者,如果您在nginx等网络服务器上运行,请调整该请求&超时配置也。

使用上面的代码和-Xms512m -Xmx1G堆大小,我上传了1.25Gb文件没有问题。如果要上载到文件存储/云存储,请确保lib使用如下流:

档案:org.apache.commons.io.FileUtils.copyToFile(inputStream, new File('<file path>')) Azure:storageBlob.upload(inputStream, length)