无法使用php zip库创建存档

时间:2015-05-23 19:37:20

标签: php

我正在尝试为家庭作业开发一个MVC PHP应用程序,该应用程序存档一些文件,这些应用程序是我在Windows 7中的Zend Server上构建的(如果它很重要)。

这是设置:我在视图中有这个表单:

<div class="box">
    <h3>What would you like to store?</h3>
    <form action="<?php echo URL; ?>archives/archiveAction" method="POST"  enctype='multipart/form-data'>
        <label>Select the files you'd like to store</label>
        <input type="file" name="upload[]" multiple>
        <input type="hidden" name="user_id" value="<?php echo $_SESSION['id']; ?>" >
        <label>Select your favorite compression algorithm</label>
        <select name="type_of_archive">
            <option value="zip">ZIP</option>
            <option value="tar">TAR</option>
            <option value="gzip">GZIP</option>
            <option value="bzip2">BZIP2</option>
        </select>
        <input type="submit" name="add_files" value="Submit" />
    </form>
</div>

然后我将它传递给负责的控制器动作:

public function archiveAction()
    {
        if(isset($_POST["user_id"]) && isset($_POST["type_of_archive"]) && isset($_FILES['upload']))
        {
            $time = new DateTime();
            if ($_POST['type_of_archive'] == 'zip')
            {
                Helper::zipFiles($_FILES['upload'],"./".$_SESSION['username']."/",$_SESSION['username']." - ".$time->format('Y-m-d H:i:s'));
            }
        }
    }

zipFiles功能本身如下:

static public function zipFiles($files, $dir, $name)
{
    $location = $dir.$filename.".zip";
    $zip = new ZipArchive();
    if ($zip->open($location, ZipArchive::CREATE)!==TRUE) {
    exit("cannot open <$filename>\n");
    }
    $num_of_files = count($files['name']);
    for($i = 0;$i<$num_of_files;$i++ )
    {
        $zip->addFile($files['tmp_name'][$i]);
    }
    $zip->close();
    return $location;

}

问题是我没有收到任何错误。我要做的是在目录中创建一个zip文件。我得到的只是我的浏览器正在下载一个名为archiveAction的空文件。我在这里缺少什么?如果我继续重试脚本,请暂停一段时间。

1 个答案:

答案 0 :(得分:1)

这是因为您使用$files['tmp_name'][$i]。如果您print_r $_FILES,您会看到$files['tmp_name'][0](例如)只是一个没有路径的文件名。因此,当您执行archiveAction脚本尝试在运行它(脚本)的目录中查找文件$files['tmp_name'][$i]时。当然没有这样的文件,因为它存储在/tmp或其他目录中的临时文件中。

因此,您应首先将上传的文件(move_uploaded_file功能)复制到某个特定位置,您知道的路径,并使用这些复制的文件和完整路径创建zip存档。例如,将它们复制到您网站的uploads文件夹。并使用:

$zip->addFile($_SERVER['DOCUMENT_ROOT'] . '/uploads/' . $somefile_name);

或者您可以找到临时文件夹的路径(选中php.ini)并使用:

$zip->addFile($temporary_path . $files['tmp_name'][$i]);