0

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

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

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

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

  • 删除该文件...zip 获得的文件夹。

  • date.hour.directory.zip使用名称(ex )导出 zip 18Sep2013_13-26-02_images.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";
         }
?>
4

1 回答 1

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'];

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

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

unlink($ZIPNAME);


  • 删除那个。和 .. zip 获得的文件夹。

$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(例如 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';

此致

于 2013-09-19T13:42:51.037 回答