将 Flux<DataBuffer> 转换为 Flux<ByteBuffer>

问题描述 投票:0回答:2

我正在研究 spring webflux 文件上传。我想从控制器将文件上传到亚马逊 S3 存储桶上。所以在控制器中我收到了以下对象

org.springframework.http.codec.multipart.FilePart

FilePart.content()
我可以得到

reactor.core.publisher.Flux<org.springframework.core.io.buffer.DataBuffer>

我的问题是如何将这个

Flux<DataBuffer>
转换为
Flux<ByteBuffer>
。我的意思是进入以下对象

Flux<java.nio.ByteBuffer>
java spring spring-boot spring-webflux project-reactor
2个回答
4
投票

您可以简单地使用

org.springframework.core.io.buffer.DataBuffer#asByteBuffer()
:

Flux<java.nio.ByteBuffer> buffers = filePart.content()
    .map(DataBuffer::asByteBuffer);

2
投票

自 Spring Boot 3.x(和 Spring 框架 6.x)以来,tmarwen

answer 中提到的 asByteBuffer() 方法已被弃用。添加了以下弃用警告:

已弃用。
自 6.0 起,支持 toByteBuffer(ByteBuffer)

readableByteBuffers()
writableByteBuffers()

如果您使用

DataBuffer

 上传文件,则可以使用 
readableByteBuffers()
。此方法返回一个 
Iterator<ByteBuffer>
,因此您可以将其与 
Flux.fromIterable()
 一起使用:

Flux<ByteBuffer> byteBuffers = filePart .content() // The `flatMapSequential` is important for larger buffers to preserve order . flatMapSequential(dataBuffer -> Flux.fromIterable(dataBuffer::readableByteBuffers));

重要readableByteBuffers()

方法是在Spring Boot 3.0.3(Spring框架6.0.5)中添加的,而自Spring Boot 3.0.0(Spring框架6.0.0)以来就出现了弃用警告。这意味着您必须将项目至少升级到 Spring Boot 3.0.3 才能正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.