【问题标题】:Upload large files Spring Webflux上传大文件 Spring Webflux
【发布时间】:2022-01-21 21:32:32
【问题描述】:

我想将文件上传到 minio 文件容器。
较小的文件可以使用此代码按预期工作:

private Mono<Boolean> saveFileToMinio(FilePart filePart) {
    log.info("About to save database to minio container...");
    Mono<Boolean> result = Mono.from(
            filePart.content().flatMap(dataBuffer -> {
                        var bytes = dataBuffer.asByteBuffer().array();
                        dataBuffer.read(bytes);
                        DataBufferUtils.release(dataBuffer);
                        return Flux.just(bytes);
                    })
                    .flatMap(databaseFileService::write)
                    .then(Mono.just(true))
                    .onErrorMap(throwable -> {
                        log.error(throwable.getMessage(), throwable);
                        return throwable;
                    }));
    log.info("Successfully saved database to minio container...");
    return result;
}

我需要提供byte[] 以便上传我的 minio 服务。
较小的文件按预期工作(将存储到容器中)。但较大的文件(我的测试中为 12 MB)不起作用。

我得到了这个例外:
java.lang.IndexOutOfBoundsException: readPosition 0 and length 1024 should be smaller than writePosition 808

【问题讨论】:

    标签: spring-webflux project-reactor


    【解决方案1】:

    我尝试了另一个 SO 帖子中的建议 DataBufferUtils.join。这有点奇怪,但我认为以下代码可以完成这项工作:

    private Mono<Boolean> saveFileToMinio(FilePart filePart) {
    
        var result = DataBufferUtils.join(filePart.content()).map(dataBuffer -> {
                    var bytes = dataBuffer.asByteBuffer().array();
                    dataBuffer.read(bytes);
                    DataBufferUtils.release(dataBuffer);
                    return bytes;
                }).map(databaseFileService::write).then(Mono.just(true))
                .onErrorMap(throwable -> {
                    log.error(throwable.getMessage(), throwable);
                    return throwable;
                });
        log.info("Successfully saved database to minio container...");
        return result;
    }
    

    尤其是这条线似乎可以解决问题: DataBufferUtils.join

    我不知道为什么,但它似乎有效。

    编辑:
    查找上面的静态join 将参数maxByteCount 设置为-1。也许另一个(对于较大的文件不起作用)设置了一些限制。但我不知道。

    【讨论】:

    • 谢谢,这条评论为我节省了几个小时
    猜你喜欢
    • 2019-12-16
    • 2021-05-12
    • 2023-04-08
    • 2020-02-25
    • 2021-08-20
    • 2019-03-12
    • 1970-01-01
    • 2018-09-09
    • 2021-08-30
    相关资源
    最近更新 更多