创建一个文件夹的zip文件并使用php下载它

时间:2015-06-16 07:00:00

标签: php download compression zip

我有一个名为document的文件夹,它包含多个文件。我想创建该文件夹的zip并动态下载。以下是我的代码

          $dir = WWW_ROOT.'/files/pdf/document';
$archive = 'MyDocument.zip';

$zip = new ZipArchive; $zip->open($archive, ZipArchive::CREATE); $files = scandir($dir); unset($files[0], $files[1]); foreach ($files as $file) { $zip->addFile($dir.'/'.$file); } $zip->close(); header('Content-Type: application/zip'); header('Content-disposition: attachment; filename='.$archive); header('Content-Length: '.filesize($archive)); readfile($archive); unlink($archive);exit;

创建了一个zip文件,但我的问题是在zip文件中,我想要的结果是文档文件夹,但zip文件包含 C-> xampp-> htdoc-> app - > webroot->文件 - > PDF->文档即可。请帮帮我

1 个答案:

答案 0 :(得分:0)

通知和警告

  

注意:使用未定义的常量WWW_ROOT - 假定为'WWW_ROOT'   第2行的C:\ xampp \ htdocs \ testy \ index.php

     

警告:   scandir(WWW_ROOT / files / pdf / document,WWW_ROOT / files / pdf / document):in   第9行的C:\ xampp \ htdocs \ testy \ index.php

     

警告:scandir(WWW_ROOT / files / pdf / document):无法打开目录:否   第9行的C:\ xampp \ htdocs \ testy \ index.php中的此类文件或目录

     

警告:scandir():(错误2):没有这样的文件或目录   第9行的C:\ xampp \ htdocs \ testy \ index.php

     

警告:为foreach()提供的参数无效   第11行的C:\ xampp \ htdocs \ testy \ index.php

解决方案

$ dir = $ _SERVER ['DOCUMENT_ROOT']。'/ files / pdf / document';

验证文件夹是否存在:/ files / pdf / document

我添加了第二个参数 - 文件名 $ zip-> addFile($ dir。'/'。$ file,$ file);

$dir = $_SERVER['DOCUMENT_ROOT'].'/files/pdf/document';
$archive = 'MyDocument.zip';


$zip = new ZipArchive;
$zip->open($archive, ZipArchive::CREATE);
$files = scandir($dir);
unset($files[0], $files[1]);
foreach ($files as $file) {
$zip->addFile($dir.'/'.$file, $file);
}
$zip->close();
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$archive);
header('Content-Length: '.filesize($archive));
readfile($archive);
unlink($archive);exit;

您可以查看:

$dir = $_SERVER['DOCUMENT_ROOT'].'/files/pdf/document';
$archive = 'MyDocument.zip';


$zip = new ZipArchive;
$zip->open($archive, ZipArchive::CREATE);
$files = scandir($dir);
unset($files[0], $files[1]);
foreach ($files as $file) {
$zip->addFile($dir.'/'.$file, $file);
}
print_r('<pre>');
print_r($dir);//path
print_r($files);//files
print_r($zip);//object zip
die;

$zip->close();
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$archive);
header('Content-Length: '.filesize($archive));
readfile($archive);
unlink($archive);exit;
  

如果文档文件夹包含另一个包含多个文件的子文件夹,则文档文件夹无法进行ziped - CHANDAN PATTNAIK

实际上我犯了一个错误

我现在有一个解决方案

    /**
 * Created by websky
 */
class myZipper extends ZipArchive{
    protected $dir;
    protected $archive;
    protected $pathsArray;

    /**
     * @param string $dir
     * @param string $name
     */
    public function __construct($dir,$name){
        $this->dir = $dir;
        $this->archive = $name;
        $this->open($this->archive, myZipper::CREATE);
        $this->myScanDir($this->dir);
        $this->addZip();
        $this->getZip();
    }

    /**
     * @param string $dir
     */
    protected function myScanDir($dir){
        $files = scandir($dir);
        unset($files[0], $files[1]);
        foreach ($files as $file) {
            if(is_dir($dir.'/'.$file)){
                $this->myScanDir($dir.'/'.$file);
            }
        else {
                $this->pathsArray[] = array('oldpath' => $dir.'/'.$file, 'newpath'=>  (($this->dir == $dir)? $file : str_replace($this->dir.'/', '', $dir).'/'.$file));
            }
        }
    }

    protected function addZip(){
        foreach($this->pathsArray as $path){
            $this->addFile($path['oldpath'],$path['newpath']);
        }
    }

    public function getZip(){
        $this->close();
        header('Content-Type: application/zip');
        header('Content-disposition: attachment; filename='.$this->archive);
        header('Content-Length: '.filesize($this->archive));
        readfile($this->archive);
        unlink($this->archive);
    }
    }

    $test = new myZipper($_SERVER['DOCUMENT_ROOT'].'/files/pdf/document', 'MyDocument.zip');