无法打开受密码保护的 zip 存档
Could not open password protected zip archive
我使用 php 7.4(lib-zip 版本 1.6.1)创建了一个 zip 存档,没有任何问题。
现在我尝试用密码保护这些 zip 存档。不仅用于使用 php 加密,而且通常用于加密。我找到了这个 tutorial。它做了它应该做的,但我无法再读取 zip 存档的文件。如果我双击存档,会打开密码提示,但它不适用于源代码中的密码。我还复制并粘贴它以防止任何键盘冲突。
<?php
$zip = new ZipArchive();
$filePath = sprintf('%s/test/', __DIR__);
$fileName = 'test.zip';
$absoluteFilePath = $filePath . $fileName;
$excludeFolderNames = [
'.',
'..',
'.DS_Store',
$fileName,
];
$zipFlag = ZipArchive::CREATE;
if (file_exists($absoluteFilePath)) {
$zipFlag = ZipArchive::OVERWRITE;
}
$createFile = $zip->open($absoluteFilePath, $zipFlag);
if (true !== $createFile) {
throw new RuntimeException(sprintf('could not open file in "%s" caused by %s', $fileName, $createFile));
}
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($filePath));
$password = 'top-secret';
if (!$zip->setPassword($password)) {
throw new RuntimeException('Set password failed');
}
/** @var SplFileInfo $value */
foreach ($iterator as $key => $value) {
if (in_array($value->getFilename(), $excludeFolderNames)) {
continue;
}
$cleanFilePath = realpath($key);
if (!$cleanFilePath) {
throw new RuntimeException(sprintf('could not create real path from filepath: %s', $key));
}
$zipName = str_replace($filePath, '', $cleanFilePath);
if (!$zip->addFile($cleanFilePath, $zipName)) {
throw new RuntimeException(sprintf('Add file failed: %s', $cleanFilePath));
}
if (!$zip->setEncryptionName($zipName, ZipArchive::EM_AES_256)) {
throw new RuntimeException(sprintf('Set encryption failed: %s', $zipName));
}
}
$zip->close();
有人遇到同样的问题还是我有问题?
更新一:
我认为将 zip 文件保存在我要压缩的文件夹之外可以解决我的问题。所以我更改了以下行:
$absoluteFilePath = sprintf('%s/%s', __DIR__, $fileName);
过了一会儿,错误又出现了。
我发现的一个可能原因是 .DS_Store 文件。在我的示例中,我排除了它们。但是错误又出现了。
更新二:
另一个问题是,如果所有文件都是空的,则没有密码提示。
更新三:
相同的代码适用于没有换行符的文件,但如果文件有多行,则会发生错误。
我在 php-bugtracker. It turns out that I can extract all the files with an zip-extension like the comments tryed to tell me before. Now I wait for the new libzip 1.7.0 版中找到了帮助,其中提供了默认的 zip 加密。在此之后我希望我可以不带任何扩展名提取我的文件。
我使用 php 7.4(lib-zip 版本 1.6.1)创建了一个 zip 存档,没有任何问题。
现在我尝试用密码保护这些 zip 存档。不仅用于使用 php 加密,而且通常用于加密。我找到了这个 tutorial。它做了它应该做的,但我无法再读取 zip 存档的文件。如果我双击存档,会打开密码提示,但它不适用于源代码中的密码。我还复制并粘贴它以防止任何键盘冲突。
<?php
$zip = new ZipArchive();
$filePath = sprintf('%s/test/', __DIR__);
$fileName = 'test.zip';
$absoluteFilePath = $filePath . $fileName;
$excludeFolderNames = [
'.',
'..',
'.DS_Store',
$fileName,
];
$zipFlag = ZipArchive::CREATE;
if (file_exists($absoluteFilePath)) {
$zipFlag = ZipArchive::OVERWRITE;
}
$createFile = $zip->open($absoluteFilePath, $zipFlag);
if (true !== $createFile) {
throw new RuntimeException(sprintf('could not open file in "%s" caused by %s', $fileName, $createFile));
}
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($filePath));
$password = 'top-secret';
if (!$zip->setPassword($password)) {
throw new RuntimeException('Set password failed');
}
/** @var SplFileInfo $value */
foreach ($iterator as $key => $value) {
if (in_array($value->getFilename(), $excludeFolderNames)) {
continue;
}
$cleanFilePath = realpath($key);
if (!$cleanFilePath) {
throw new RuntimeException(sprintf('could not create real path from filepath: %s', $key));
}
$zipName = str_replace($filePath, '', $cleanFilePath);
if (!$zip->addFile($cleanFilePath, $zipName)) {
throw new RuntimeException(sprintf('Add file failed: %s', $cleanFilePath));
}
if (!$zip->setEncryptionName($zipName, ZipArchive::EM_AES_256)) {
throw new RuntimeException(sprintf('Set encryption failed: %s', $zipName));
}
}
$zip->close();
有人遇到同样的问题还是我有问题?
更新一: 我认为将 zip 文件保存在我要压缩的文件夹之外可以解决我的问题。所以我更改了以下行:
$absoluteFilePath = sprintf('%s/%s', __DIR__, $fileName);
过了一会儿,错误又出现了。
我发现的一个可能原因是 .DS_Store 文件。在我的示例中,我排除了它们。但是错误又出现了。
更新二: 另一个问题是,如果所有文件都是空的,则没有密码提示。
更新三: 相同的代码适用于没有换行符的文件,但如果文件有多行,则会发生错误。
我在 php-bugtracker. It turns out that I can extract all the files with an zip-extension like the comments tryed to tell me before. Now I wait for the new libzip 1.7.0 版中找到了帮助,其中提供了默认的 zip 加密。在此之后我希望我可以不带任何扩展名提取我的文件。