このコードをZipファイルに保存していますが、このファイルをパスワードで保護する必要があります
$file = 'backup.sql';
$zipname = $file.'.Zip';
$Zip = new ZipArchive;
$Zip->open($zipname, ZipArchive::CREATE);
ZipArchive::setPassword('123456');
//$Zip->setPassword("123456");
$Zip->addFile($file);
$Zip->close();
$ Zip-> setPasswordを使用するとエラーは発生しませんが、ファイルはまったく保護されません。ZipArchive:: setPasswordを使用すると、このエラーが発生します。「致命的なエラー:非静的メソッドZipArchive :: setPassword()はできません。静的に呼び出されます」
では、ファイルをphpで圧縮し、パスワードで保護するにはどうすればよいでしょうか。
はい、パスワードで保護されたアーカイブの作成はサポートされていません(保護されていないアーカイブとして作成されます)。
ただし、パスワードで保護されたアーカイブを抽出するために使用することはできます。
問題に戻ります。
あなたはいつでも
<?php echo system('Zip -P pass file.Zip file.txt'); ?>
(これはWindowsと私たちの最愛のLinuxの両方で動作します)
ただし、要件に合わない場合は、続行しましょう。
DotNetZip (Windowsのみ)を使用することをお勧めします。PHPからAES暗号化Zipアーカイブを正確に動的に生成します。
<?php
// Origin: https://stackoverflow.com/a/670804/3684575
try
{
$fname = "Zip-generated-from-php-" . date('Y-m-d-His') . ".Zip";
$zipOutput = "c:\\temp\\" . $fname;
$zipfact = new COM("Ionic.Zip.ZipFile");
$Zip->Name = $zipOutput;
$dirToZip= "c:\\temp\\psh";
# Encryption: 3 => 256-bit AES.
# 2 => 128-bit AES.
# 1 => PKZIP (Weak).
# 0 => None
$Zip->Encryption = 3;
$Zip->Password = "AES-Encryption-Is-Secure";
$Zip->AddDirectory($dirToZip);
$Zip->Save();
$Zip->Dispose();
if (file_exists($zipOutput))
{
header('Cache-Control: no-cache, must-revalidate');
header('Content-Type: application/x-Zip');
header('Content-Disposition: attachment; filename=' . $fname);
header('Content-Length: ' . filesize($zipOutput));
readfile($zipOutput);
unlink($zipOutput);
}
else
{
echo '<html>';
echo ' <head>';
echo ' <title>Calling DotNetZip from PHP through COM</title>';
echo ' <link rel="stylesheet" href="basic.css"/>';
echo ' </head>';
echo '<body>';
echo '<h2>Whoops!</h2>' . "<br/>\n";
echo '<p>The file was not successfully generated.</p>';
echo '</body>';
echo '</html>';
}
}
catch (Exception $e)
{
echo '<html>';
echo ' <head>';
echo ' <title>Calling DotNetZip from PHP through COM</title>';
echo ' <link rel="stylesheet" href="basic.css"/>';
echo ' </head>';
echo '<body>';
echo '<h2>Whoops!</h2>' . "<br/>\n";
echo '<p>The file was not successfully generated.</p>';
echo '<p>Caught exception: ', $e->getMessage(), '</p>', "\n";
echo '<pre>';
echo $e->getTraceAsString(), "\n";
echo '</pre>';
echo '</body>';
echo '</html>';
}
?>
しかし、それでも、これは非常に汚い解決策であり、Linuxでは機能しません。
So、PHPは成熟した言語ですが、適切な方法はありません(カスタム拡張などを除く)純粋なPHPでこのような単純なタスクを実行します。
あなたもできることは、 PHP 7.2 が本番環境で利用可能になるまで待つことです(cuz ZipArchive :: setEncryptionName が実装されます(PierreとRemiに感謝します) ))。
ただし、それまでは、 php_Zip > = 1.14.0をPHP <7.2に移植することもできますが、現在、コンパイル済みのバイナリはありません。なので、自分でコンパイルして、可能かどうか試してみる必要があります(そうだと思います)。
p.s。試してみますが、現在PCにVS2015 +がありません。
PHP 7.2を使用して、パスワードで保護されたZipファイルを作成します。
$Zip = new ZipArchive;
$res = $Zip->open('filename.Zip', ZipArchive::CREATE); //Add your file name
if ($res === TRUE) {
$Zip->addFromString('FILENAME_WITH_EXTENSION', 'file content goes here'); //Add your file name
$Zip->setEncryptionName('FILENAME_WITH_EXTENSION', ZipArchive::EM_AES_256, 'PASSWORD'); //Add file name and password dynamically
$Zip->close();
echo 'ok';
} else {
echo 'failed';
}
ZipArchive :: setPassword この関数は、アーカイブの解凍に使用するパスワードのみを設定します。パスワードで保護されていないZipArchiveをパスワードで保護されたZipArchiveに変えることはありません。
作業コード:
$ file = 'file_name_to_be_compressed.extension'
system( 'Zip -PZip_PASSWORD'。$ file。 '。Zip'。$ file);
PHP 7.2)以降、 setEncryptionName を使用して、パスワードで保護されたZipアーカイブを作成できます。