php 如何读取zip压缩包中的单个文件

siv3szwd  于 2023-02-11  发布在  PHP
关注(0)|答案(2)|浏览(193)

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

bnlyeluc

bnlyeluc1#

尝试使用zip:// wrapper

$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;
new9mtju

new9mtju2#

请注意,如果zip文件受密码保护,@Rocket-Hazmat fopen解决方案可能会导致无限循环,因为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文件有密码保护,那么您可能会看到类似
警告:文件获取内容(zip://文件. zip #文件. txt):无法打开流:操作失败
不过有个办法
从PHP 7.2开始,增加了对加密存档的支持。

    • 因此,对于**file_get_contentsfopen,您都可以这样做
$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/一样传递它,并在末尾加上一个正斜杠。

相关问题