我需要读取一个zip文件中的单个文件“test.txt”的内容。整个zip文件是一个非常大的文件(2gb),包含很多文件(10,000,000),因此提取整个文件对我来说不是一个可行的解决方案。我如何读取单个文件?
bnlyeluc1#
尝试使用zip:// wrapper:
zip://
$handle = fopen('zip://test.zip#test.txt', 'r'); $result = ''; while (!feof($handle)) { $result .= fread($handle, 8192); } fclose($handle); echo $result;
您也可以使用file_get_contents:
file_get_contents
$result = file_get_contents('zip://test.zip#test.txt'); echo $result;
new9mtju2#
请注意,如果zip文件受密码保护,@Rocket-Hazmat fopen解决方案可能会导致无限循环,因为fopen将失败,feof无法返回true。
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文件有密码保护,那么您可能会看到类似警告:文件获取内容(zip://文件. zip #文件. txt):无法打开流:操作失败不过有个办法从PHP 7.2开始,增加了对加密存档的支持。
$options = [ 'zip' => [ 'password' => '1234' ] ]; $context = stream_context_create($options); echo file_get_contents('zip://file.zip#file.txt', false, $context);
$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/一样传递它,并在末尾加上一个正斜杠。
locateName
folder/
2条答案
按热度按时间bnlyeluc1#
尝试使用
zip://
wrapper:您也可以使用
file_get_contents
:new9mtju2#
请注意,如果zip文件受密码保护,@Rocket-Hazmat
fopen
解决方案可能会导致无限循环,因为fopen
将失败,feof
无法返回true。这解决了无限循环问题,但是如果您的zip文件有密码保护,那么您可能会看到类似
警告:文件获取内容(zip://文件. zip #文件. txt):无法打开流:操作失败
不过有个办法
从PHP 7.2开始,增加了对加密存档的支持。
file_get_contents
和fopen
,您都可以这样做这将工作(不需要知道密码)
注意:要使用
locateName
方法定位文件夹,您需要像folder/
一样传递它,并在末尾加上一个正斜杠。