如何读取 zip 存档中的单个文件
我需要读取zip文件中单个文件“test.txt”的内容。整个zip文件是一个非常大的文件(2gb),包含很多文件(10,000,000),因此提取整个文件对我来说不是一个可行的解决方案。如何读取单个文件?
我需要读取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;
请注意,如果zip文件受密码保护,@Rocket-Hazmat解决方案可能会导致无限循环,因为将失败并且无法返回true。fopen
fopen
feof
您可能希望将其更改为
$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/