Ziparchive排除文件夹&如何使它通用

时间:2013-09-18 11:31:37

标签: php zip ziparchive

这是我在互联网上找到的代码,旨在创建整个文件夹的.zip并下载。

我想做一些改变,但我尝试的一切都不起作用。我想要的是什么:

  • 使它成为通用的(即我希望在根文件夹中有makezip.php。我是文件管理员,每次我从某个位置调用此脚本(例如www.domain.com/files/media/images/它获取该文件夹)。

  • 下载后删除zip(我认为我做得很好,使用了命令unlink,但我不确定这是正确的方法。

    < / LI>
  • 删除该zip文件夹中的...文件夹。

  • 导出名为date.hour.directory.zip(ex 18Sep2013_13-26-02_images.zip)的zip。我试着这样做 $fd = getcwd(); $filename = date("dMY_H:i:s").'_'.$fd.'.zip'; 但它没有用,它只获得$ fd变量。

我知道它不应该给你所有的代码,并期望你会看到它或调试它,但我已经尝试了一切,没有任何工作。我自己学习,而且我在php上有点新手。

祝你好运

<?php
        function download($file) {
                header('Content-Description: File Transfer');
                header('Content-Type: application/octet-stream');
                header('Content-Disposition: attachment; filename='.basename($file));
                header('Content-Transfer-Encoding: binary');
                header('Expires: 0');
                header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
                header('Pragma: public');
                header('Content-Length: ' . filesize($file));
                ob_clean();
                flush();
                readfile($file);
        unlink($file);
                exit;
        }

        $directory = '.';
        $files = scandir($directory);
        if(empty($files)) 
        {
                echo("You haven't selected any file to download.");
        } 
        else 
        {
                $zip = new ZipArchive();
                $filename =  date("dMY_H:i:s").'_arquivo.zip'; //adds timestamp to zip archive so every file has unique filename
                if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) { // creates new zip archive
                                exit("Cannot open <$filename>\n");
                }
                $N = count($files);
                for($i=0; $i < $N; $i++)
                {
                  $zip->addFile($files[$i], $files[$i]); //add files to archive
                }
                $numFiles = $zip->numFiles;
                $zip->close();

                $time = 8; //how long in seconds do we wait for files to be archived.
                $found = false;
                for($i=0; $i<$time; $i++){

                 if($numFiles == $N){   // check if number of files in zip archive equals number of checked files
                        download($filename);
                        $found = true;
                        break;
                 }
                 sleep(1); // if not found wait one second before continue looping
         }

         if($found) { }
                 else echo "Sorry, this is taking too long";
         }
?>

1 个答案:

答案 0 :(得分:0)

好的,我自己已经找到了问题,而且我正在为那些想要的人分享解决方案。

  • 让它通用(即我想在根文件夹中有makezip.php。我有一个文件管理器,每次我从某个位置调用这个脚本(例如www.domain.com/files/media/images) /它获取该文件夹)。

我修改了index.php上的代码,并对zip.php进行了一些更改(处理压缩过程的文件。简单解决方案..笨蛋!

1 - index.php - 只需输入一个简单的链接

<a href="zip.php?dirz=HERE_GOES_THE_FOLDER_URL">Download folder as a .zip</a>

2 - zip.php

$directory = $_REQUEST['dirz'];

  • 下载后删除拉链(我认为我做得很好,使用了命令unlink但我不确定这是正确的方法。

是的,这是对的。 (在zip.php上)

unlink($ZIPNAME);


  • 删除它。和...拉链的文件夹。

$direct = array_diff(scandir($directory), array(".","..","error_log"));

foreach($direct as $file){
        if(is_file($directory.'/'.$file)){
            $zip->addFile($directory.'/'.$file, $file);
        }
}

  • 使用名称date.hour.directory.zip导出zip(ex 18Sep2013_13-26-02_images.zip)。我试着这样做$ fd = getcwd(); $ filename = date(“dMY_H:i:s”)。'_'。$ fd。'。zip';但它没有用,它只获得$ fd变量。

简单如下:

$zipname = date("dMY_H-i-s").'_'.basename($directory).'.zip';

祝你好运