如何读取zip存档中的单个文件

2020/12/31 07:21 · php ·  · 0评论

我需要在zip文件中读取单个文件“ test.txt”的内容。整个zip文件是一个非常大的文件(2gb),其中包含很多文件(10,000,000),因此,提取整个文件对我而言不是可行的解决方案。如何读取单个文件?

尝试使用zip://包装器

$handle = fopen('zip://test.zip#test.txt', 'r'); 
$result = '';
while (!feof($handle)) {
  $result .= fread($handle, 8192);
}
fclose($handle);
echo $result;

您也可以使用file_get_contents

$result = file_get_contents('zip://test.zip#test.txt'); 
echo $result;

请注意,fopen如果使用密码保护zip文件,@ Rocket-Hazmat解决方案可能会导致无限循环,因为fopen它将失败,并且feof在发生错误时始终为true。

您可能需要将其更改为

$handle = fopen('zip://file.zip#file.txt', 'r');
$result = '';
if ($handle) {
    while (!feof($handle)) {
        $result .= fread($handle, 8192);
    }
    fclose($handle);
}
echo $result;

这解决了无限循环问题,但是如果您的zip文件受密码保护,那么您可能会看到类似

警告:file_get_contents(zip://file.zip#file.txt):无法打开流:操作失败

有一个解决方案

从PHP 7.2开始,增加了对加密档案的支持。

因此,您既可以这样做, file_get_contents 又可以 fopen

$options = [
    'zip' => [
        'password' => '1234'
    ]
];

$context = stream_context_create($options);
echo file_get_contents('zip://file.zip#file.txt', false, $context);

但是,一种更好的解决方案是使用 ZipArchive,在读取文件之前先检查文件是否存在而不用担心加密的存档

$zip = new ZipArchive;
if ($zip->open('file.zip') !== TRUE) {
    exit('failed');
}
if ($zip->locateName('file.txt') !== false) {
    echo 'File exists';
} else {
    echo 'File does not exist';
}

这将起作用(无需知道密码)

注意:要使用locateName方法定位文件夹,您需要像最后folder/一个斜杠一样传递它

本文地址:http://php.askforanswer.com/ruheduquzipcundangzhongdedangewenjian.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!