您的位置:首页 > 新闻 > 热点要闻 > PHP使用ZipArchive创建带密码保护的压缩包

PHP使用ZipArchive创建带密码保护的压缩包

2024/12/22 2:51:39 来源:https://blog.csdn.net/hbh112233abc/article/details/141193405  浏览:    关键词:PHP使用ZipArchive创建带密码保护的压缩包

关于PHP使用ZipArchive创建带密码保护的压缩包的示例,好多只提到setPassword进行设置,包括ai助手也是

可是如果真的那样操作,发现用压缩软件打开后并不需要密码验证,可以直接解压读取文件内容的.

后来参考了官方的说明: PHP: ZipArchive::setEncryptionName - Manual

对需要加密的文件还是需要使用setEncryptionName进行设置后才有效果的.

比如以下代码:

$zip = new \ZipArchive;
$res = $zip->open('test.zip', \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
if ($res === TRUE) {$zip->setPassword('huang');$zip->addFromString('test1.txt', 'huang 666');$zip->setEncryptionName('test1.txt', \ZipArchive::EM_AES_256);$zip->addFromString('test2.txt', 'huang 222');// $zip->setEncryptionName('test2.txt', \ZipArchive::EM_AES_256);$res = $zip->close();$this->assertTrue($res);// unlink('test.zip');
} else {$this->assertNotTrue($res);
}

对test2.txt未设置setEncryptionName,生成的压缩包中test2.txt将不受密码保护,可以直接读取其中内容

最终展示一下我的代码:

/**
* 文件打包操作
*
* @param string $filePath 文件或文件夹路径
* @param string $zipFile 生成的压缩包路径
* @param string $pwd 密码,为空则不设置密码
* @return string 压缩包路径
*/
function zip(string $filePath, string $zipFile, string $pwd = '')
{if (!is_dir($filePath) && !is_file($filePath)) {throw new \Exception('filePath must be file or dir:' . $filePath);}$zip = new \ZipArchive();$res = $zip->open($zipFile, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);if ($res !== true) {throw new \Exception("create zip failed:" . $res);}if (!empty($pwd)) {$zip->setPassword($pwd);}$filePath = str_replace("\\", '/', $filePath);if (is_file($filePath)) {$filename = basename($filePath);$zip->addFile($filePath, $filename);if (!empty($pwd)) {$zip->setEncryptionName($filename, \ZipArchive::EM_AES_256);}} else {$trimLen = mb_strlen($filePath);if ($filePath[-1] == '/') {$trimLen -= 1;}$files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($filePath),\RecursiveIteratorIterator::LEAVES_ONLY);foreach ($files as $file) {if (!$file->isDir()) {$path         = $file->getRealPath();$relativePath = mb_substr($path, $trimLen);$path         = str_replace("\\", '/', $path);$relativePath = str_replace("\\", '/', $relativePath);$zip->addFile($path, $relativePath);if (!empty($pwd)) {$zip->setEncryptionName($relativePath, \ZipArchive::EM_AES_256);}}}}$zip->close();return $zipFile;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com