下面是我如何用CakePHP实现这一点,它工作得很好。首先,我确保我的应用程序代码位于公共html目录之上,这样它就不会暴露在web上。基本上用户只能直接访问文件索引.php文件,css/js和图像文件。
function beforeSave() {
extract($this->data['Upload']['file']);
if(isset($name) and !empty($name)) {
$filename = time().'-'.$name;
if ($size && !$error) {
move_uploaded_file($tmp_name, APP . 'media/files/' . $filename);
$this->data['Upload']['file'] = $filename;
$this->data['Upload']['name'] = $name;
$this->data['Upload']['file_type'] = $type;
}
} else {
// remove the photo so it is not updated
unset($this->data['Upload']['file']);
}
return parent::beforeSave();
}
function beforeDelete() {
$data = $this->read(null, $this->id);
if( is_file( APP . 'media/files/' . $data['Upload']['file'])) {
unlink(APP . 'media/files/' . $data['Upload']['file']);
}
return true;
}
这将管理文件上载并将所有命名信息放入数据库。而且由于app/media/files目录对web是不可访问的,所以我不必保护该目录。这意味着无论用户想要什么文件,他们都必须从网站上访问它。