为 InputStreamResource 提供 ByteBuffer(s) 并使用它通过 HTTP 上传数据。可能吗?

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

我创建了一个名为

LocalChunkSender
的类,实现了一个名为
ChunkSender
的接口。
ChunkSender
为其他类公开一个 16KB
ByteBuffer
以填充数据,然后将此缓冲区写入一个
java.nio.channels.WritableByteChannel
,后者写入本地文件(chunk-file)。 当另一个类确定足够的字节已存储到当前块文件中时,它命令 ChunkSender 关闭当前块文件,打开一个新文件,故事继续进行。

以下是抽象 BaseChunkSender 的关键方法:

@Override
public void sendChunkBuffer(DataChunk chunk) throws IOException {
    if (currentChunk == null) {
        currentChunk = chunk;
        checkSum = 0;
        checkedOutputStream = new CheckedOutputStream(createChunkStream(chunk), new CRC32());
        outChannel = Channels.newChannel(checkedOutputStream);
    }
    outChannel.write(buffer);
    buffer.clear();
}

protected abstract OutputStream createChunkStream(DataChunk chunk) throws IOException;

createChunkStream()
方法由
LocalChunkSender
实现,并提供
OutputStream
WritableByteChannel
使用。

现在我想制作另一个 ChunkSender 实现,通过 POST 将 ByteBuffer 数据发送到远程 REST 服务。 我想我应该使用由

org.springframework.http.RequestEntity<InputStreamResource>
构造的
org.springframework.core.io.InputStreamResource
,但问题是: 我的
ChunkSender
没有任何
InputStream
用于
InputStreamResource
因为通过其 16KB
ByteBuffer
接收数据,这应该写在
WritableByteChannel
中。 我想避免将完整的块文件存储在内存中,或作为临时文件,然后在 POST 中将其作为普通
MultiPartFile
发送,因为这会占用太多内存和时间。

所以我的问题是:构建一个由

InputStreamResource
循环喂养的
ByteBuffer
然后使用它(即使在单独的线程中)来制作
RequestEntity
的主体是否可能且合理? 或者有什么更好的解决方案吗?

我已经搜索过类似的问题,关于将数据流式传输到 POST 上传中,但是所有示例都从

InputStream
(例如从本地文件)中获取 RequestEntity 主体的字节

java http upload http-post
© www.soinside.com 2019 - 2024. All rights reserved.