我一直在使用Netty将NIO Streaming-Server移植到HTTP。它支持下载在服务器上按需生成的zip存档。经过一些研究和原型设计,我做了自己的ChunkedInput实现来实现这个功能。
在每次调用nextChunk期间,我读取当前文件的一些字节,将其压缩并将其写入ChannelBuffer,然后返回。只要有要处理的数据和文件(isEndOfInput长时间返回false),这就会迭代。
问题是,无法打开传输的存档。错误消息告诉我,缺少一些字节。
我100%确定我正在发送所有数据,因为我计算通过ChannelBuffers返回的总生成字节数。此总和与下载的存档完全不同,缺少的字节数。为了在nextChunk的每次迭代中进行调试,我读取了ChannelBuffers实际内容并将其写入FileOutputStream。写入的文件是有效的存档,可以打开,因此压缩中不会出现错误。
是否有一些专业实现自定义ChunkedInput与ChunkedWriteHandler或我错过了什么?
答案 0 :(得分:1)
当ChannelBuffer排队等待写入时,您需要为每个块使用新的ChannelBuffer。如果您重复使用相同的ChannelBuffer,则可能会破坏内容。
答案 1 :(得分:0)
我查看了ChunkedFile的实现,并注意到在nextChunk中总是使用ChannelBuffers.wrappedBuffer(bytes)返回一个新的ChannelBuffer。在我的ChunkedInput实现中,我使用一个ChannelBuffer,它在nextChunk中更新然后返回,所以我不会在每次调用nextChunk时创建一个新的ChannelBuffer。 我改变了我的nextChunk-Method以在每次调用期间返回一个新的ChannelBuffer,它现在可以正常工作。