2

我想在 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.'"');
4

3 回答 3

3

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

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

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

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

于 2013-09-12T11:46:04.067 回答
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 压缩数据格式规范版本 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);
?>
于 2013-09-07T04:05:25.117 回答
1

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

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

于 2013-09-11T20:43:49.053 回答