将 zip:// 包装器用于包含名称未知的单个文件的存档
Using the zip:// wrapper for an archive with a single file whose name is unknown
PHP 允许使用 zip://
wrapper:
即时读取 ZIP 文件
$fp = fopen ('zip://archive.zip#dir/file.txt', 'rb');
很好,当你知道压缩文件名时。这不是我的情况:我的应用程序必须处理包含单个文件的 ZIP 存档,该文件的名称在打开存档之前是未知的。
是否有选项告诉包装器打开存档中的第一个文件,而不是文件名?
我知道我可以使用 ZipArchive or Zip Functions,我只是想保持简单并尽可能使用流包装器。
在深入了解包装器的 source code 后,我找到了问题的答案。
目前无法在不提供文件名的情况下使用包装器打开存档。
解决方案包括同时使用包装器和 ZipArchive
:
$path = '/path/to/archive.zip';
$zip = new \ZipArchive();
if ($zip->open($path) === true) {
if ($zip->numFiles === 1) {
$compressedFileName = $zip->statIndex(0)['name'];
$zipPath = 'zip://' . $path . '#' . $compressedFileName;
$fp = fopen($zipPath, 'rb');
// ...
}
}
PHP 允许使用 zip://
wrapper:
$fp = fopen ('zip://archive.zip#dir/file.txt', 'rb');
很好,当你知道压缩文件名时。这不是我的情况:我的应用程序必须处理包含单个文件的 ZIP 存档,该文件的名称在打开存档之前是未知的。
是否有选项告诉包装器打开存档中的第一个文件,而不是文件名?
我知道我可以使用 ZipArchive or Zip Functions,我只是想保持简单并尽可能使用流包装器。
在深入了解包装器的 source code 后,我找到了问题的答案。
目前无法在不提供文件名的情况下使用包装器打开存档。
解决方案包括同时使用包装器和 ZipArchive
:
$path = '/path/to/archive.zip';
$zip = new \ZipArchive();
if ($zip->open($path) === true) {
if ($zip->numFiles === 1) {
$compressedFileName = $zip->statIndex(0)['name'];
$zipPath = 'zip://' . $path . '#' . $compressedFileName;
$fp = fopen($zipPath, 'rb');
// ...
}
}