使用GZIPOutputStream进行压缩以无需在本地创建gzip文件上传

4

我想在上传文件之前使用GZIPOutputStream在Java中压缩文件。是否有一种方法可以仅将gzipped文件存储在内存中以进行上传,而不必在本地计算机上生成gzipped文件?

谢谢!


1
你可以将它存储为字节数组。 - Petar Butkovic
3个回答

2
只需直接将GZipOutputStream连接到输出流并进行写入即可,无需文件。

GzipCompressingEntity是推荐的方法,因为它还可以调整内容长度/内容类型/内容编码请求头,并确保正确的消息分隔。 - ok2c
我试图查找如何使用GzipCompressingEntity,但没有找到太多信息。我是否只需创建一个GzipCompressingEntity类的实体,并将其设置为我的put请求中的实体?当我这样做时,我会收到SocketTimepoutException异常。 - lanczlot
是的,您只需使用GzipCompressingEntity来装饰另一个实体即可。SocketTimepoutException与GZIP编码无关。 - ok2c

0

使用GzipCompressingEntity装饰内容实体

HttpPost httpPost = new HttpPost("https://host/stuff");
httpPost.setEntity(new GzipCompressingEntity(new FileEntity(new File("my.stuff"))));
CloseableHttpResponse response = httpclient.execute(httpPost);
try {
    EntityUtils.consume(response.getEntity());
} finally {
    response.close();
}

0
通过编写到临时文件并在gzip上传完成后对临时文件执行.deleteonexit,解决了此问题。
感谢你的帮助!

使用一些流可能是最好的选择。但如果这段代码在服务器上运行并且永远不退出,或者某些错误导致JVM崩溃呢? - Shawn
你的意思是直接将数据流式传输到服务器?如果JVM崩溃了,数据流该如何处理?我目前是使用GZIPOutputStream将数据流式传输到临时文件,然后再上传到服务器。 - lanczlot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接