【问题标题】:Uploading a large file (>1GB) to grails3将大文件 (>1GB) 上传到 grails3
【发布时间】:2018-01-09 08:08:14
【问题描述】:

将一个大文件(>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,并且在控制器中有一个我试图避免的多部分文件,因为它将存储整个文件。有什么想法吗?

【问题讨论】:

    标签: grails upload interceptor grails3


    【解决方案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>')) 蔚蓝:storageBlob.upload(inputStream, length)

    【讨论】:

    • 之所以有效,是因为该文件临时存储在服务器磁盘上。但这就是我要避免的,我只想获取输入流的句柄并流过它,然后省略
    • 我明白了。然后我能想到的就是你必须完全禁用grails multipartResolver,因为它使用spring CommonsMultipartResolver,它在某些/配置大小超过时临时存储上传到servlet容器中,并在用户请求结束时清除。
    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    相关资源
    最近更新 更多