我正在尝试为家庭作业开发一个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的空文件。我在这里缺少什么?如果我继续重试脚本,请暂停一段时间。
答案 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]);