如何使用PHP创建ZIP文件并在用户下载后将其删除?

2022-08-30 20:31:45

我需要将图像从其他网站下载到我的服务器。使用这些图像创建一个 ZIP 文件。自动开始下载创建的ZIP文件。下载完成后,应从我的服务器中删除ZIP文件和图像。

除了自动下载之外,下载链接也可以。但其他逻辑保持不变。


答案 1

好吧,您必须首先使用 ZipArchive 类创建 zipfile

然后,发送:

  • 正确的标题,向浏览器指示它应该下载一些zip - 参见heade() - 该手册页面上有一个示例应该会有所帮助
  • zip 文件的内容,使用 readfile()

最后,使用unlink()从服务器中删除zip文件。


注意:作为安全预防措施,自动运行PHP脚本(通常通过crontab)可能是明智的,这将删除临时目录中的旧zip文件。

这只是为了以防您的正常PHP脚本有时会中断,并且不会删除临时文件。


答案 2
<?php 

Zip('some_directory/','test.zip');

if(file_exists('test.zip')){
    //Set Headers:
    header('Pragma: public');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime('test.zip')) . ' GMT');
    header('Content-Type: application/force-download');
    header('Content-Disposition: inline; filename="test.zip"');
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: ' . filesize('test.zip'));
    header('Connection: close');
    readfile('test.zip');
    exit();
}

if(file_exists('test.zip')){
    unlink('test.zip');

}


function Zip($source, $destination)
{
    if (!extension_loaded('zip') || !file_exists($source)) {
        return false;
    }

    $zip = new ZipArchive();
    if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
        return false;
    }

    $source = str_replace('\\', '/', realpath($source));

    if (is_dir($source) === true)
    {
        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

        foreach ($files as $file)
        {
            $file = str_replace('\\', '/', realpath($file));

            if (is_dir($file) === true)
            {
                $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
            }
            else if (is_file($file) === true)
            {
                $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
            }
        }
    }
    else if (is_file($source) === true)
    {
        $zip->addFromString(basename($source), file_get_contents($source));
    }

    return $zip->close();
}

?>

推荐