file - spring webflux Flux<DataBuffer> 转换为 InputStream

标签 file inputstream flux spring-webflux

我目前正在研究 Spring WebFlux。
我正在尝试使用 Spring WebFlux 上传大文件 (70mo)。
我的 Controller

@RequestMapping(method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public Flux<String> uploadHandler(@RequestBody Flux<Part> fluxParts, @RequestParam(value = "categoryType") String categoryType, @PathVariable(value = "traceabilityReportUuid") String traceabilityUuid) {
    return documentHandler.upload(fluxParts, UUID.fromString(traceabilityUuid), categoryType);
}
我的服务
public Flux<String> upload(Flux<Part> fluxParts, UUID traceabilityUuid, String categoryType) {

    return fluxParts
            .filter(part -> part instanceof FilePart)
            .ofType(FilePart.class)
            .flatMap(p -> this.upload(p, traceabilityUuid, categoryType));


}


private Mono<String> upload(FilePart filePart, UUID traceabilityUuid, String categoryType) {

    return filePart.content().collect(InputStreamCollector::new, (t, dataBuffer) -> t.collectInputStream(dataBuffer.asInputStream()))
            .flatMap(inputStreamCollector -> {
                upload(traceabilityUuid, inputStreamCollector.getInputStream(), filePart.filename(), categoryType);

                return Mono.just("OK");
            });
}
我的收藏家
public class InputStreamCollector {

    private InputStream is;

    public void collectInputStream(InputStream is) {
        if (this.is == null) this.is = is;
        this.is = new SequenceInputStream(this.is, is);
    }

    public InputStream getInputStream() {
        return this.is;
    }
}
最后,我通过这种方式检索了完整的输入流:inputStreamCollector.getInputStream()并传递给我的对象。
我使用这个对象来发送到存储桶 S3。
但是在发送到 S3 之前,我必须将其转换为文件(使用 apache 工具),我有一个 stackoverflow 异常。
java.lang.StackOverflowError: null
at java.base/java.io.SequenceInputStream.read(SequenceInputStream.java:156)
at java.base/java.io.SequenceInputStream.read(SequenceInputStream.java:156)
at java.base/java.io.SequenceInputStream.read(SequenceInputStream.java:156)
at java.base/java.io.SequenceInputStream.read(SequenceInputStream.java:156)
at java.base/java.io.SequenceInputStream.read(SequenceInputStream.java:156)
at java.base/java.io.SequenceInputStream.read(SequenceInputStream.java:156)
at java.base/java.io.SequenceInputStream.read(SequenceInputStream.java:156)
at java.base/java.io.SequenceInputStream.read(SequenceInputStream.java:156)
它适用于小文件(7mo ..)
你有什么想法可以解决我的问题吗?

最佳答案

关于file - spring webflux Flux<DataBuffer> 转换为 InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51676922/

相关文章:

file - Mule 文件传输不删除源文件

java - Java中的文本文件拆分库

C++按升序打印文件名

java - 输入流读取器空指针异常

java - 这是 ASCII 类型吗?

java - Logger 和 System.out.println 的输出不按顺序

redux - 处理 Redux Store 数据中的依赖关系

python - 如何以列表/字典的形式读取文件?

javascript - react 通量: what's the point of actions?

javascript - react/flux- 子组件用户事件 - 是否应该通过调度程序路由所有内容