PHP zip功能

时间:2012-03-27 08:15:08

标签: php zip

我正在尝试使用阵列中的特定文件构建目录树并将其推送下载。这部分工作正常。

问题是当我尝试用内容填充特定文件时。

下载完成后,文件为空。

但是执行switch case语句并且所有方法都正常工作。

我认为问题在于我的zip功能,但我真的不知道应该搜索什么(或者代码设计可能不是最好的)。

<?php
include_once 'class.file.php';

class CreateComponent{



    function __construct(){

        if (isset($_POST['name'])){

        $this->createDirectoryTree($_POST['name']);

        }

        else{

            echo '<h1>error!</h1>';

        }

    }   

    function createDirectoryTree($component_name){

        $component_name="com_".$component_name;

        $this->create_zip($component_name);

    }

    function create_zip($component) {


        $jcomp=str_replace("com_", "", $component);

        $dirs= array(
                $jcomp.'.xml',
                'site/'.$jcomp.'.php',
                'site/views/index.html',
                'site/views/to_change/index.html',
                'site/views/to_change/tmpl/index.html',
                'site/views/to_change/tmpl/default.xml',
                'site/views/to_change/tmpl/default.php',
                'site/models/index.html',
                'site/controllers/index.html',
                'site/tables/index.html',
                'site/index.html',
                'admin/index.html',
                'admin/views/index.html',
                'admin/models/index.html',
                'admin/controllers/index.html',
                'admin/sql/updates/index.html',
                'admin/sql/updates/mysql/0_1.sql'
        );

        $file = tempnam("tmp", "zip");

        $zip = new ZipArchive();

        foreach ($dirs as $dir){
            $zip->open($file, ZIPARCHIVE::CREATE);
            $zip->addEmptyDir($dir);


        switch ($dir){

            case (substr( $dir, strrpos( $dir, '/' )+1 ) == "index.html"):

            $zip->addFromString($dir, '<html><body bgcolor="#FFFFFF"></body></html>');
            break;

            case "site/$jcomp.php":
            $main_php= new File();
//          echo $main_php->main_controller($jcomp);
            $zip->addFromString($dir,$main_php->main_controller($jcomp));

            $zip->addFromString($dir, '');
            break;

            case "$jcomp.xml":
            $main_php= new File();
            $zip->addFromString($dir,$main_php->main_xml($jcomp));

            break;


}


        $zip->addFromString($dir, '');


        }
        $zip->close();



        // Stream the file to the client
        header('Content-Type: application/zip');
        header('Content-Length: ' . filesize($file));
        header('Content-Disposition: attachment; filename= "'.$component.'.zip"');
        readfile($file);
        unlink($file);
    }



}

$component= new CreateComponent();

1 个答案:

答案 0 :(得分:1)

乍一看,我会改变以下几行

    $zip = new ZipArchive();

    foreach ($dirs as $dir){
        $zip->open($file, ZIPARCHIVE::CREATE);
        $zip->addEmptyDir($dir);

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

    foreach ($dirs as $dir){
        $zip->addEmptyDir($dir);

因为每次添加目录时都要打开文件,这对我来说似乎不对。

另一方面,我会设置组件名称策略并在构造函数中检查它以防止输入利用。

我不知道,也许一个好名字政策会 - 只允许字母字符,数字和破折号进入模块名称 -