【问题标题】:gzip and return as stringgzip 并以字符串形式返回
【发布时间】:2013-09-03 21:21:24
【问题描述】:

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

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

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

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('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$filename.'"');

【问题讨论】:

  • 我也试过了,并没有在 gzip 文件中创建 tar。
  • gzencode 生成 gzip 存档 (.gz) 而不是 gzip tar (.tar.gz)。您所拥有的是一个名称为 tar-19 的文件。您确定这些文件是由上述脚本生成的吗?
  • 如何解决它,使文件作为字符串表现得像创建的文件?

标签: php gzip gzipstream


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    我确定您查看了http://php.net/manual/en/function.gzcompress.php

    确保您拥有 php 版本 PHP 4 >= 4.0.1, PHP 5

     string gzcompress ( string $data [, int $level = -1 [, int $encoding = ZLIB_ENCODING_DEFLATE ]] )
    

    此函数使用 ZLIB 数据格式压缩给定的字符串。

    有关 ZLIB 压缩算法的详细信息,请参阅文档“»ZLIB Compressed Data Format Specification version 3.3”(RFC 1950)。

    <?php
    $compressed = gzcompress('Compress me', 9);
    echo $compressed;
    ?>
    

    注意:

    这与 gzip 压缩不同,它包含一些标头 数据。 gzip 压缩见 gzencode()。

    参数

    数据

    The data to compress.
    

    等级

    压缩级别。可以为 0 表示无压缩,最高为 9 以获得最大的压缩率。

    If -1 is used, the default compression of the zlib library is used which is 6. 
    

    编码

    ZLIB_ENCODING_* 常量之一。

    gzencode — 创建一个 gzip 压缩字符串

    <?php
    $data = implode("", file("bigfile.txt"));
    $gzdata = gzencode($data, 9);
    $fp = fopen("bigfile.txt.gz", "w");
    fwrite($fp, $gzdata);
    fclose($fp);
    ?>
    

    【讨论】:

      【解决方案3】:

      您是否尝试在将文件作为字符串发送时传递“Content-type: application/x-gzip”标头?

      Apache 可能正在通过 gzip 过滤器重新运行它,这会导致问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-03
        • 2015-04-02
        • 2016-11-23
        • 2014-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多