php - gzip 并作为字符串返回

标签 php gzip gzipstream

我想在 PHP 中使用 gzip 压缩一些文件..

当输出文件被保存到文件中时,它会正常工作。当文件打开时,它看起来像这样

enter image description here

但当输出作为字符串返回时不是这样。然后打开的文件看起来是这样的。为什么 tar 文件显示在 gzip 文件中?

enter image description here

public function compress(){
    if($this->stream){
        return gzencode($this->data, 9);
    }
    else{
        $gz = gzopen('test.tar.gz', 'w9');
        gzwrite($gz, $this->data);
        gzclose($gz);
    }
}

通过字符串输出发送到浏览器的 header

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$filename.'"');

最佳答案

这看起来像是 WinRAR 文件扩展名解析问题。

在第一个示例中,您的文件名为 .tar.gz 并且 WinRAR 知道如何处理 tar 文件和 gz 压缩,所以它能够解压缩内存中的 tar header 并检索其中包含的文件列表。

在您的第二个示例中,文件名为 .tar-19.gz,因此 WinRAR 很乐意处理 gz 压缩,但不知道 tar-19 是什么格式应该是(它甚至不尝试从标题启发式猜测)

我敢打赌,如果您使用 tar.gz 扩展名流式传输文件,它会打开得很好。

关于php - gzip 并作为字符串返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18601707/

相关文章:

c# - 为什么我的 GZipStream 不可写?

azure - 为什么使用自定义文件扩展名上传到 azure blob 容器的 gzip 压缩文件会通过生成的 sas 下载为 .gz?

php - 数据库连接在 Yii cronjob 中不起作用

php - 为什么 apache2 服务器最多需要 1.5 小时才能写入 6 mb .sql 文件

php 在终端上打印出 "Terminated",没有任何错误

websocket - websocket可以支持gzip压缩吗?

php - 每年重置一次数据库索引的最佳实践?

tomcat - 如何在嵌入式tomcat中gzip响应

go - 如何将目录[不仅仅是其中的文件]写入golang中的tar.gz文件

c# - 使用 GZipStream 压缩空输入导致 C# 中的无效 gz 文件