ZipArchive PHP只添加整个路径中没有目录的文件



其他编码人员:

我讨厌问这个问题,事实上,我相信已经正确回答了两次:

  1. 此处

  2. 这里是

所以问题是:当解压缩下载的"file.zip"时,解压缩后,它包含了路径中的所有文件夹,甚至我在addFile函数中指定了本地文件。我希望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);

有人能看到这个代码有什么问题吗?

附加信息:

I、 ofc,使用相对于webroot的路径,但提取文件夹中的文件夹层次结构位于:提取到文件->"my_file.zip"是C->examplep->htdocs->my_cakephp_web_app->app->webroot->files这不是我想要实现的:)

PHP 5.4.4

Windows XP、XAMPP

编辑

尝试使用http://www.phpconcept.net/pclzip/图书馆,也遇到了同样的问题。同样在我的家用电脑(win7)上,这个代码运行得很好。

这就引出了一个问题:是否有我不知道的设置需要满足?

我已经运行了您的代码,它按预期工作。因此,从我所看到的情况来看,有三件事可能会出错。

如果旧文件仍然存在并且未被覆盖,请尝试使用这些标志(不清楚$obj['Name']设置为什么)如果您阅读了php手册中的注释,那么使用ZIPARCHIVE::CREATE和ZIPARCHIVE::OVERWRITE有不同程度的成功,所以也许两者都可以使用。

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

Pathinfo可能失败并返回整个路径,或者由于某种原因为空

是否可以对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 ) );
}

也许你的os/php版本有一个带有addFile函数的错误(不太可能,因为我看不到任何其他解释,所以抓住了救命稻草)

在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::buildFromIteratorLEAVES_ONLY标志一起使用。

您需要测试每个文件,看看它是否是一个文件(而不是目录、符号链接等):

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

这是使用文件类型,但您也可以使用is_file。

我完全不知道为什么会这样:)

我真的相信,我的电脑进入了天网模式,并以某种方式使用了addFile方法:)

任何能够合理解释发生了什么的人都将获得+50奖金:)

    $zipname = str_replace( ' ', '_', $obj['Name'] ) . '.zip';
    $zip = new ZipArchive;
    $zip->open( $zipname, ZipArchive::CREATE );
    foreach ( $files as $file )
    {
        // the str_replace made it work???
        $zip->addFile( str_replace( '/webroot', '', getcwd() . '/' . $file ), pathinfo( $file, PATHINFO_BASENAME ) );
    }
    $zip->close();
    header("Content-type: application/zip");
    header("Content-Disposition: attachment; filename=" . $zipname);
    header('Content-Length: ' . filesize( $zipname ));
    readfile( $zipname );

编辑:

此外,在遇到临时文件无法自行删除的问题后,我切换到http://www.phpconcept.net/pclzip/,效果良好。

此外,Alix Axel在下面提到了PharData,考虑到他在这里获得的分数,我也在考虑他的方法。。

最新更新