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

如何使用PHP创建ZIP文件,并在用户下载后将其删除?,php,download,zip,Php,Download,Zip,我需要从其他网站下载图片到我的服务器。用这些图像创建一个ZIP文件。自动开始下载创建的ZIP文件。下载完成后,应将ZIP文件和图像从我的服务器上删除 下载链接也可以,而不是自动下载。但是其他逻辑保持不变。那么,您必须首先使用类创建zipfile 然后,发送: 右边的标题,指示浏览器应该下载一些东西作为zip文件——请参见标题()——该手册的页面上有一个示例应该会有所帮助 zip文件的内容,使用 最后,使用从服务器中删除zip文件 注意:作为安全预防措施,让PHP脚本自动运行(通常由cron

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


下载链接也可以,而不是自动下载。但是其他逻辑保持不变。

那么,您必须首先使用类创建zipfile

然后,发送:

  • 右边的标题,指示浏览器应该下载一些东西作为zip文件——请参见
    标题()
    ——该手册的页面上有一个示例应该会有所帮助
  • zip文件的内容,使用
最后,使用从服务器中删除zip文件


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


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

知道有多少zip文件下载被中断,需要继续吗

如果持续下载只占下载量的一小部分,您可以立即删除zip文件;只要您的服务器仍在将文件发送到客户机,它就会保留在磁盘上

一旦服务器关闭文件描述符,文件的引用计数将降至零,最后其磁盘上的块将被释放


但是,如果许多下载被中断,您可能会花费大量时间重新创建zip文件。如果你能成功的话,这是一个非常便宜的优化方法。

以下是我过去如何做到这一点的。此代码假定您已将文件写入
$path
变量指定的路径。您可能必须使用php的
exec

 // write the files you want to zip up
file_put_contents($path . "/file", $output);

// zip up the contents
chdir($path);
exec("zip -r {$name} ./");

$filename = "{$name}.zip";

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.urlencode($filename));
header('Content-Transfer-Encoding: binary');

readfile($filename);

首先,从webiste下载图像

然后,用你下载的文件创建一个(伟大的图特)


最后,您使用(参见示例1)

启用php\u curl扩展名将此zip文件发送到浏览器;(php.ini),然后使用下面的代码创建zip。
创建文件夹类并使用下面给出的代码:

<?php 
    include("class/create_zip.php");
    $create_zip     =   new create_zip();
    //$url_path,$url_path2 you can use your directory path
            $urls = array(
                 '$url_path/file1.pdf',         
                 '$url_path2/files/files2.pdf'
                 ); // file paths 


            $file_name      =   "vin.zip";   // zip file default name
            $file_folder    =   rand(1,1000000000); // folder with random name
            $create_zip->create_zip($urls,$file_folder,$file_name);  
            $create_zip->delete_directory($file_folder);  //delete random folder 

            if(file_exists($file_name)){
             $temp = file_get_contents($file_name);     
             unlink($file_name); 
            }       

            echo $temp;

    ?>
<?php

    class create_zip{

        function create_zip($urls,$file_folder,$file_name){

            header('Content-Type: application/octet-stream'); 
            header('Content-Disposition: attachment; filename='.$file_name); 
            header('Content-Transfer-Encoding: binary');

                $mkdir  =   mkdir($file_folder); 

                $zip    = new ZipArchive;
                $zip->open($file_name, ZipArchive::CREATE); 

                foreach ($urls as $url)
                {
                     $path=pathinfo($url);     
                     $path = $file_folder.'/'.$path['basename'];
                     $zip->addFile($path);     
                     $fileopen = fopen($path, 'w');     
                     $init = curl_init($url);     
                     curl_setopt($init, CURLOPT_FILE, $fileopen);     
                     $data = curl_exec($init);     
                     curl_close($init);     
                     fclose($fileopen); 
                } 

                $zip->close();


            }

            function delete_directory($dirname) 
            {
                if (is_dir($dirname))
                $dir_handle = opendir($dirname); 
                if (!$dir_handle)
                return false;
                    while($file = readdir($dir_handle))
                    {
                        if ($file != "." && $file != "..") 
                        {
                            if (!is_dir($dirname."/".$file))             
                            unlink($dirname."/".$file);          
                            else            
                            delete_directory($dirname.'/'.$file);           
                        }    
                    }
                closedir($dir_handle);    
                rmdir($dirname);    
                return true; 
            }



    }

    ?>

创建文件夹类并使用下面给出的代码:

<?php 
    include("class/create_zip.php");
    $create_zip     =   new create_zip();
    //$url_path,$url_path2 you can use your directory path
            $urls = array(
                 '$url_path/file1.pdf',         
                 '$url_path2/files/files2.pdf'
                 ); // file paths 


            $file_name      =   "vin.zip";   // zip file default name
            $file_folder    =   rand(1,1000000000); // folder with random name
            $create_zip->create_zip($urls,$file_folder,$file_name);  
            $create_zip->delete_directory($file_folder);  //delete random folder 

            if(file_exists($file_name)){
             $temp = file_get_contents($file_name);     
             unlink($file_name); 
            }       

            echo $temp;

    ?>
<?php

    class create_zip{

        function create_zip($urls,$file_folder,$file_name){

            header('Content-Type: application/octet-stream'); 
            header('Content-Disposition: attachment; filename='.$file_name); 
            header('Content-Transfer-Encoding: binary');

                $mkdir  =   mkdir($file_folder); 

                $zip    = new ZipArchive;
                $zip->open($file_name, ZipArchive::CREATE); 

                foreach ($urls as $url)
                {
                     $path=pathinfo($url);     
                     $path = $file_folder.'/'.$path['basename'];
                     $zip->addFile($path);     
                     $fileopen = fopen($path, 'w');     
                     $init = curl_init($url);     
                     curl_setopt($init, CURLOPT_FILE, $fileopen);     
                     $data = curl_exec($init);     
                     curl_close($init);     
                     fclose($fileopen); 
                } 

                $zip->close();


            }

            function delete_directory($dirname) 
            {
                if (is_dir($dirname))
                $dir_handle = opendir($dirname); 
                if (!$dir_handle)
                return false;
                    while($file = readdir($dir_handle))
                    {
                        if ($file != "." && $file != "..") 
                        {
                            if (!is_dir($dirname."/".$file))             
                            unlink($dirname."/".$file);          
                            else            
                            delete_directory($dirname.'/'.$file);           
                        }    
                    }
                closedir($dir_handle);    
                rmdir($dirname);    
                return true; 
            }



    }

    ?>

其他解决方案:在创建新zip文件之前删除以前的文件:

    // Delete past zip files script
    $files = glob('*.zip'); //get all file names in array
    $currentTime = time(); // get current time
    foreach($files as $file){ // get file from array
        $lastModifiedTime = filemtime($file); // get file creation time

        // get how old is file in hours:
        $timeDiff = abs($currentTime - $lastModifiedTime)/(60*60);

        //check if file was modified before 1 hour:
        if(is_file($file) && $timeDiff > 1)
            unlink($file); //delete file
    }

我去那里寻找一个类似的解决方案,在阅读了评论后发现了这个问题:在专用文件夹中创建zip文件(这里称为“zip_文件”)之前,删除所有您估计的超过合理时间的zip文件(我花了24小时):

$dossier_zip='zip_files';
如果(是目录($dossier\u zip))
{
$t_zip=$dossier_zip./*.zip'.#这允许您让index.php、.htaccess和其他内容。。。
foreach(glob($t_-zip)作为$old_-zip)
{

if(is_file($old_zip)和filemtime($old_zip)到目前为止,您尝试了什么?堆栈溢出不是为您提供源代码的。您需要自己尝试并解决此问题。如果您遇到了特定的问题/问题,请在首先检查其他用户是否尚未提出相同的问题后发布一个有针对性的问题。zip文件将永远不会被删除。这不是真的可能的无法从代码中删除zip文件,因为您不知道下载何时完成。您确实需要通过cron作业删除该文件。难道您不能将zip文件读入字符串,然后删除该文件吗?当然,仅适用于相对较小的文件,但这似乎是一种不错的方法。谢谢,这是一个很好的信息,真的解决此问题所需的唯一信息。不知道为什么不增加投票。我猜当用户暂停下载时,它会崩溃,但除此之外,这是最好的解决方案。我想,如果我自己正在下载一个文件,然后创建另一个下载,它会删除我已经加载的文件?或者我在这里遗漏了什么?