我想在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.'"');
答案 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过滤器重新运行它,这会导致问题。