Вот как я реализую это с помощью CakePHP, и она прекрасно работает. Во-первых, я проверяю, что код моего приложения находится над общедоступным каталогом html, чтобы он не был доступен в Интернете. Таким образом, в основном, единственные файлы, к которым пользователи имеют прямой доступ, - это файл index.php, файлы css / js и image.
Затем я обновляю свою модель управления файлами, чтобы сохранять и удалять файлы на лету:
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 недоступен для Интернета, мне не нужно защищать каталог. Это означает, что независимо от того, какой файл пользователь хочет, он должен получить к нему доступ с веб-сайта.
Затем все, что вам нужно сделать, - это убедиться, что в таблице моделей есть флаг "общего доступа", чтобы пользователь мог указать, что файл доступен для всего мира, и тогда любой желающий сможет увидеть файл и загрузить его.