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 回答