7

仲間のコーダー:

この質問をするのは嫌いですが、2 回正しく答えられたと思います。

  1. ここ

  2. そしてここ

問題は、ダウンロードした「file.zip」を解凍すると、解凍後にパスのすべてのフォルダーが含まれていることです。zip ファイルにサブフォルダーを含めず、ファイルのみを含めたいと思います。

$zipname = str_replace(' ', '_', $obj['Name']) . '.zip';

$zip = new ZipArchive();

$zip->open($zipname, ZipArchive::CREATE);
foreach ($files as $file) {
    // $file looks like this: webroot/uploadify/files/file.jpg
    $zip->addFile($file, pathinfo($file, PATHINFO_BASENAME));
}

$zip->close();

header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=" . $zipname);
header("Pragma: no-cache");
header("Expires: 0");
header('Content-Length: ' . filesize($zipname));

readfile($zipname);

このコードの何が問題なのか誰にもわかりますか?

追加情報:

私は、多くの場合、webroot からの相対パスを使用しますが、解凍後のフォルダーのフォルダー階層は次のとおりですまさに私が達成したかったものではないファイル:)

PHP 5.4.4

Windows XP、XAMPP

編集

http://www.phpconcept.net/pclzip/ライブラリを使用してみましたが、同じ問題がありました。また、私の自宅の PC ( win7 ) でも、このコードはうまく機能しました。

ここで疑問が生じます:私が認識していない、満たさなければならない設定はありますか?

4

4 に答える 4

4

コードを実行しましたが、期待どおりに動作します。したがって、私が見ることができるものから、うまくいかない可能性のあることが3つあります。

古いファイルがまだ存在し、上書きされていない場合は、これらのフラグを使用してみてください ( $obj['Name'] が何に設定されているかが明確ではありません) ZIPARCHIVE::CREATE と ZIPARCHIVE::OVERWRITE を使用するため、おそらく両方を使用しても機能します。

$zip->open( $zipname, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE );

Pathinfo が何らかの理由で失敗し、パス全体または null を返す可能性があります

pathinfo 出力で var_dump を実行して、期待どおりであることを確認することはできますか?

foreach ( $files as $file )
{
     var_dump(pathinfo( $file, PATHINFO_BASENAME ));

    // $file looks like this: webroot/uploadify/files/file.jpg
    // $zip->addFile( $file, pathinfo( $file, PATHINFO_BASENAME ) );
}

addFile 関数を使用した os/php バージョンにバグがある可能性があります (他の説明が見当たらないため、ここでストローを把握している可能性は低いです)。

于 2013-08-26T10:07:03.530 に答える
3

PHP 5.3 では、次のようにする必要があります。

$phar = new PharData('file.zip');

// add all files in the folder, only include files with extensions
$phar->buildFromDirectory('/directory', '~[.][0-9a-z]+$~i');

フラグPharData::buildFromIteratorと一緒に使用することもできます。LEAVES_ONLY

于 2013-08-31T09:11:44.593 に答える
2

各ファイルをテストして、(ディレクトリやシンボリックリンクなどではなく) ファイルであるかどうかを確認する必要があります。

foreach ( $files as $file )
{
    if(filetype($file) == 'file') {
        $zip->addFile( $file, pathinfo( $file, PATHINFO_BASENAME ) );
    }
}

これはfiletypeを使用していますが、 is_fileを使用することもできます。

于 2013-08-23T08:27:07.877 に答える