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

问题描述 投票:0回答:3

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

php zip gzip zlib
3个回答
64
投票

尝试使用

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;

4
投票

请注意@Rocket-Hazmat

fopen
如果zip文件受密码保护,解决方案可能会导致无限循环,因为
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/
一样使用 末尾有正斜杠。


0
投票

如果您想要一种简单方便的方法来直接读取 zip 中单个文件的内容,而不需要解压所有其他文件,您可以使用 Turbodepot 库。

只需下载 Phar 文件并使用 ZipObject 类:

require 'path/to/your/dependencies/folder/turbocommons-php-X.X.X.phar';
require 'path/to/your/dependencies/folder/turbodepot-php-X.X.X.phar';
    
use org\turbodepot\src\main\php\model\ZipObject;

$zipObject = new ZipObject();
$zipObject->loadPath('/path/to/your/archive.zip');

然后只需调用readEntry方法即可获取单个文件的数据:

try {
    $data = $zipObject->readEntry('example.txt');
    echo "Content of $entryName:\n$data";
} catch (UnexpectedValueException $e) {
    echo "Error reading entry: " . $e->getMessage();
}

更多信息在这里:

https://turboframework.org/en/blog/2024-04-28/load-and-read-zip-data-in-php-using-turbodepot

© www.soinside.com 2019 - 2024. All rights reserved.