gzip并返回为字符串

时间:2013-09-03 21:21:25

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

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分: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);
?>

答案 2 :(得分:1)

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

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