我有一个远程ZIP文件,我需要读取ZIP文件中的文件内容,而无需将ZIP文件复制到我们的服务器。应该有一些解决方案来解决这个问题,但我找不到
示例:
URL-http://example.com/feed.zip和
ZIP档案中的文件是feed.xml
我需要读取feed.xml
的内容并将其保存在一个变量中。就是这样。
我尝试过$z = new ZipArchive();
和open,但open只能从服务器读取文件,而不能读取远程文件。
一个超级懒惰的解决方案是:
$feed = `wget http://example.com/feed.zip -qO- | unzip - -p feed.xml`;
请注意,如果url不是固定字符串,则应该对其进行转义(escapeshellarg)。
但您也可以研究内置ZipArchive之外的其他ZIP类。PEAR或PclZip可能允许在没有解决方案的情况下从流中读取。(但是php://memory如果你真的想避开临时文件,那么字符串流包装器也可能是可行的。)
我也遇到了同样的问题,我能得到的最好的方法是将zip内容保存到临时文件中,并使用ZipArchive
来获得压缩文件的内容:
public static function unzip($zipData) {
// save content into temp file
$tempFile = tempnam(sys_get_temp_dir(), 'feed');
file_put_contents($tempFile, $zipData);
// unzip content of first file from archive
$zip = new ZipArchive();
$zip->open($tempFile);
$data = $zip->getFromIndex(0);
// cleanup temp file
$zip->close();
unlink($tempFile);
return $data;
}
这基本上是@mauris建议的实现。
这需要临时文件的概念。从技术上讲:是的,您将制作一个本地可用的远程zip文件的临时副本,因为您的ZipArchive
根本不适用于远程zip文件。
按照以下步骤实现临时复制应该会对您有所帮助:
- 将远程zip文件复制到临时文件夹中
- 使用
ZipArchive
解析zip文件的本地副本 - 阅读feed.xml文件中的信息
- 关闭所有内容并删除zip文件的本地副本