如果我将以下行添加到HttpStaticFileServerInitializer
pipeline.addLast("decoder", new HttpRequestDecoder());
pipeline.addLast("aggregator", new HttpObjectAggregator(65536));
pipeline.addLast("encoder", new HttpResponseEncoder());
pipeline.addLast("chunkedWriter", new ChunkedWriteHandler());
pipeline.addLast("deflater", new HttpContentCompressor()); // Added
文件随Content-Encoding: gzip
一起提供,但内容实际上并未进行gzip压缩。这会导致大多数浏览器无法解码内容。
DefaultFileRegion
不能与HttpContentCompressor
一起使用,或者还有其他必须做的事情让他们一起工作吗?
答案 0 :(得分:3)
您可以获得分块传输(ChunkedWriteHandler)和HttpContentCompressor一起工作。您只需提供一个ChunkedInput来生成 HttpContent 对象,而不是 ByteBuf 对象。
这是一个快速的写作: http://andreas.haufler.info/2014/01/making-http-content-compression-work-in.html
答案 1 :(得分:0)
不幸的是,分块传输和gzip内容编码是一个困难的组合。压缩不能在块级别上进行,而是在整个内容上进行(使得实时数据不可能)。因此,您需要自己压缩内容然后传输它。在您的示例中,这意味着您不能组合使用块编写器和内容压缩器。
答案 2 :(得分:0)
根据Clement的评论和随后在 #netty 中的讨论,听起来好像不可能一起使用DefaultFileRegion
和HttpContentCompressor
。我切换回ChunkedFile
,它运行正常。
RandomAccessFile raf = new RandomAccessFile(file, "r");
if (request.method() != HttpMethod.HEAD) {
ctx.write(new ChunkedFile(raf, 0, fileLength, 8192));
}
我还对HttpContentCompressor
进行了子类化,并对内容类型进行了一些检查,以确定文件是否应该被压缩(JPEG,PNG和其他二进制文件跳过压缩步骤。)