我正在尝试使用阵列中的特定文件构建目录树并将其推送下载。这部分工作正常。
问题是当我尝试用内容填充特定文件时。
下载完成后,文件为空。
但是执行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();
答案 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);
因为每次添加目录时都要打开文件,这对我来说似乎不对。
另一方面,我会设置组件名称策略并在构造函数中检查它以防止输入利用。
我不知道,也许一个好名字政策会 - 只允许字母字符,数字和破折号进入模块名称 -