0

問題なくphp 7.4(lib-zipバージョン1.6.1)でzipアーカイブを作成していました。

今、これらの zip アーカイブをパスワードで保護しようとしています。PHPでの暗号化だけでなく、一般的に. このチュートリアルを見つけました。本来の動作をしますが、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();

誰かが同じ問題を抱えていますか、それとも私が問題ですか?

更新I: zipファイルをzipしたいフォルダーの外に保存することで問題が解決すると思いました。そこで、次の行を変更しました。

$absoluteFilePath = sprintf('%s/%s', __DIR__, $fileName);

しばらくするとまたエラーが発生しました。

私が発見した考えられる理由の 1 つは、.DS_Store ファイルでした。私の例では、それらを除外します。しかし、再びエラーが発生しました。

更新 II: もう 1 つの問題は、すべてのファイルが空の場合、パスワード プロンプトが表示されないことです。

UPDATE III: 改行のないファイルでも同じコードが機能しますが、ファイルに複数の行がある場合、エラーが発生します。

4

1 に答える 1

0

php-bugtrackerでヘルプを見つけました。コメントが以前に私に伝えようとしたように、すべてのファイルをzip 拡張子で抽出できることがわかりました。今は、デフォルトの zip 暗号化が利用できる新しいlibzipバージョン 1.7.0 を待ちます。この後、拡張子なしでファイルを抽出できることを願っています。

于 2020-05-26T14:55:08.617 に答える