【问题标题】:compressing with GZIPOutputStream to upload without creating a gzip file locally使用 GZIPOutputStream 压缩上传,无需在本地创建 gzip 文件
【发布时间】:2014-09-22 19:07:37
【问题描述】:

在使用GZIPOutputStream 上传文件之前,我正在尝试在 java 中压缩文件。有没有办法将压缩后的文件存储在内存中以供上传,而不是让它在本地计算机上生成压缩后的文件?

谢谢!

【问题讨论】:

  • 你可以将它存储为字节数组。

标签: java apache-httpclient-4.x gzipstream gzipoutputstream


【解决方案1】:

只需将 GZipOutputStream 直接连接到输出流并写入即可。不需要文件。

【讨论】:

  • GzipCompressingEntity 是这样做的推荐方式,因为它还调整内容长度/内容类型/内容编码请求标头并确保正确的消息描述。
  • 我试图查找如何使用 GzipCompressingEntity 却找不到太多。我是否只需创建一个 GzipCompressingEntity 类的实体并将其设置为我的 put 请求中的实体?当我这样做时,我得到一个 SocketTimepoutException。
  • 是的,您只需使用 GzipCompressingEntity 来装饰另一个实体。 SocketTimepoutException 与 GZIP 编码无关。
【解决方案2】:

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();
}

【讨论】:

    【解决方案3】:

    通过写入临时文件并在 gzip 上传完成后对临时文件执行 .deleteonexit 解决了这个问题。

    感谢您的帮助!

    【讨论】:

    • 使用一些流将是最好的..如果这段代码在服务器上运行并且永远不会退出怎么办?还是某些错误导致您的 JVM 崩溃?
    • 您的意思是直接将其流式传输到服务器?流如何处理 JVM 崩溃?我目前使用 GZIPOutputStream 流式传输到临时文件,然后将其上传到服务器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2018-06-02
    相关资源
    最近更新 更多