我正在研究 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>
您可以简单地使用
org.springframework.core.io.buffer.DataBuffer#asByteBuffer()
:
Flux<java.nio.ByteBuffer> buffers = filePart.content()
.map(DataBuffer::asByteBuffer);
自 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 才能正常工作。