2

フォルダ階層も圧縮せずに、2つのファイルを別のディレクトリに圧縮しようとしています。

このイベントはボタンを押すことでトリガーされ、JavascriptはAJAXを使用してPHPに情報を送信します。PHPはPerlスクリプトを呼び出し(PerlのXLSXライターモジュールとPHPの種類が悪いという事実を利用するために、しかし私は逸脱します...)、ファイルを階層のいくつかのフォルダーに配置します。関連するコードを以下に示します。

system("createFiles.pl -ids ${rows} -test ${test} -path ${path}",$retVal);

`zip ${path}/{$test}_both.zip ${path}/${test}.csv ${path}/${test}.xlsx`;
`zip ${path}/{$test}_csv.zip  ${path}/${test}.csv`;

問題は、zipファイルに${path}階層があり、ファイルが次のように表示される前にナビゲートする必要があることです。

階層付きZip

私はこれをやってみました(各zipコマンドの前にcd):

system("createFiles.pl -ids ${rows} -test ${test} -path ${path}",$retVal);

`cd ${path}; zip {$test}_both.zip ${test}.csv ${test}.xlsx`;
`cd ${path}; zip {$test}_csv.zip  ${test}.csv`;

そしてそれはうまくいきました、しかしそれはハックのようです。もっと良い方法はありますか?

4

2 に答える 2

1

PHP 5> = 5.2.0を使用する場合は、ZipArchiveクラスを使用できます。次に、フルパスをソースファイル名として使用し、ファイル名だけをターゲット名として使用できます。このような:

$zip = new ZipArchive;
if($zip->open("{$test}_both.zip", ZIPARCHIVE::OVERWRITE) === true) {
    // Add the files here with full path as source, short name as target
    $zip->addFile("${path}/${test}.csv", "${test}.csv");
    $zip->addFile("${path}/${test}.xlsx", "${test}.xlsx");
    $zip->close();
} else {
    die("Zip creation failed.");
}

// Same for the second archive
$zip2 = new ZipArchive;
if($zip2->open("{$test}_csv.zip", ZIPARCHIVE::OVERWRITE) === true) {
    // Add the file here with full path as source, short name as target
    $zip2->addFile("${path}/${test}.csv", "${test}.csv");
    $zip2->close();
} else {
    die("Zip creation failed.");
}
于 2012-12-25T23:08:03.800 に答える
1

OldskoolによるZipArchiveの回答は良いです。私はZipArchiveを使用しましたが、動作します。ただし、より用途が広いため、代わりにPclZipをお勧めします(たとえば、圧縮せずに圧縮できるため、すでに圧縮されている画像をはるかに高速に圧縮する場合に理想的です)。PclZipは、すべてのファイルパスを削除するためのPCLZIP_OPT_REMOVE_ALL_PATHオプションをサポートしています。例えば

$zip = new PclZip("$path/{$test}_both.zip");
$files = array("$path/$test.csv", "$path/$test.xlsx");

// create the Zip archive, without paths or compression (images are already compressed)
$properties = $zip->create($files, PCLZIP_OPT_REMOVE_ALL_PATH);
if (!is_array($properties)) {
    die($zip->errorInfo(true));
}
于 2012-12-25T23:24:21.473 に答える