1

我正在尝试为存储在数据库中的所有图像创建一个 zip 文件。这是在用户单击下载按钮时完成的。现在,您单击下载按钮,创建 zip 文件并弹出窗口询问您是否要打开文件或将其保存到您的计算机。如果您打开文件,它会显示所有文件名(就像它应该显示的那样)。问题是,当您尝试查看图像时,它们都是相同的图像,只是名称不同。

这是我的代码:

    /* creates a compressed zip file */
function create_zip($files = array(), $destination = '', $overwrite = false) {
    //if the zip file already exists and overwrite is false, return false
    if(file_exists($destination) && !$overwrite) { return false; }
    //vars
    $path = 'admin/ReviewFiles/';
    $valid_files = array();
    //if files were passed in...
    if(is_array($files)) {
        //cycle through each file
        foreach($files as $file) {
            //make sure the file exists
            $fullFile = $path . $file;
            if(file_exists($fullFile)) {
                $valid_files[] = $file;
            }
        }
    }
    //if we have good files...
    if(count($valid_files)) {
        //create the archive
        $zip = new ZipArchive();
        if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
            return false;
        }
        //add the files
        foreach($valid_files as $file) {
            $zip->addFile($file);
        }

        //close the zip -- done!
        $zip->close();

        //check to make sure the file exists
        return file_exists($destination);
    }
    else
    {
        return false;
    }
}

And here's where the function is called:

    $i = 0;
    $reviewFiles = array();
    while ($row = mysql_fetch_object($result))
    {
        $reviewFiles[$i] = $row->fileName;
        $i++;
    }
    $zipCreated = create_zip($reviewFiles, 'reviewFiles.zip', true);
    $file = 'reviewFiles.zip';
if ($zipCreated) {
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename=reviewFiles.zip');
    header('Expires: 0');
    header('Pragma: no-cache');
    readfile("reviewFiles.zip");
    exit;
}

我已经尝试了我能想到的一切来弄清楚为什么它实际上没有下载每个图像。所以,我想清楚地说,我的问题是:如何修复代码以使其实际压缩每个文件,而不仅仅是一个具有不同名称的相同图像的图像?

谢谢!

4

1 回答 1

0

这:

if(file_exists($fullFile)) {
    $valid_files[] = $file;
}

应该:

if(file_exists($fullFile)) {
    $valid_files[] = $fullFile;
}

否则找不到文件。如果您已更改此设置,您可能还希望设置一个本地名称:

foreach($valid_files as $file) {
    $zip->addFile($file, basename($file));
}

basename()用来防止 zip 在存档中创建子目录。

于 2013-05-09T01:17:41.493 回答