правильное использование mkdir()

У меня есть путь к каталогу «/uploads/files». Когда пользователь регистрируется, я пытаюсь добавить его user_id в конец пути, чтобы сделать его «uploads/files/user_id», чтобы у каждого пользователя была своя собственная папка для загрузки. Я использую Laravel, и мой текущий код выглядит так...

mkdir("uploads/files/" . Auth::user()->id);

Это правильный способ создать новую папку? Я играл с ним кучей разных способов и, похоже, ничего не работает.


person coryj    schedule 21.12.2012    source источник
comment
Что происходит, когда вы пытаетесь выполнить вышеуказанный код? Если вы получаете какую-либо ошибку, не могли бы вы указать ее здесь.   -  person Bhavik Shah    schedule 21.12.2012
comment
Попытка получить свойство необъектной ошибки, та же строка, что и код.   -  person coryj    schedule 21.12.2012
comment
попробуйте сначала повторить Auth::user()-›id, тип ошибки, которую вы упомянули, я думаю, проблема в нем. Хотя это всего лишь предложение.   -  person Bhavik Shah    schedule 21.12.2012
comment
попробуйте var_dump(Auth::user());exit;, это должно дать вам некоторые идеи... может быть, он возвращает array или null   -  person Alex    schedule 21.12.2012


Ответы (2)


mkdir это путь. Однако вы должны иметь в виду, что разрешение Linux должно быть установлено правильно, чтобы это работало. Убедитесь, что у вас есть права на запись. Вы можете уточнить у is_writable($dirPath). Установите разрешение на 755 или на то, что, по вашему мнению, лучше всего подходит для вашего приложения.

Вы также можете использовать синтаксис Linux, как показано ниже... это удобно для более сложных операций.

 $path = '/uploads/files/user_id_dir';
 shell_exec("mkdir -p $path");
person Alex    schedule 21.12.2012
comment
не мог заставить работать синтаксис linux, но сработало $path = 'uploads/files/' . Auth::user()-›id; мкдир($путь, 0700); - person coryj; 21.12.2012

если вы не хотите, чтобы ваши каталоги были легко доступны и угадываемы, вы можете просто сделать хэш вашего user_id, а затем добавить к нему. это просто прекрасно, как простой простой случай. Но с точки зрения безопасности это может быть угрозой.

просто используйте md5() или sha1() вместе со случайной сложной строкой в ​​качестве salt, чтобы защитить ваши каталоги и избежать угадывания.

и еще одна вещь помещается в условие if, чтобы проверить, создана ли уже папка.

$path = 'path_to_your_directory';
if(!file_exists($path)
{
     //then create the directory
}
else
{
    //do the upload here
}

РЕДАКТИРОВАТЬ: если вы используете Auth::user()->id, пользователь должен войти на сайт. то есть сеанс должен существовать. Иначе это не сработает. Думаю, вы это знаете.

person Praveen Puglia    schedule 21.12.2012
comment
Все еще в состоянии перечислить директорию и взломать совпадения. - person Roman Newaza; 21.12.2012
comment
@coryjacik, не парься. Лучше защитите свой сервер. - person Roman Newaza; 21.12.2012
comment
вы всегда можете использовать htaccess или простой пустой index.html, чтобы прекратить перечисление каталога. в .htaccess это будет так же просто, как Options -Indexes, не так ли? - person Praveen Puglia; 21.12.2012
comment
.htaccess не является предпочтительным способом, так как это время выполнения, и кто сказал, что его загрузки находятся в корневом каталоге документа? - person Roman Newaza; 21.12.2012
comment
ну, он этого не сказал ... но просто для небольшой безопасности я добавил эту информацию на случай, если он просто загружает вещи. Можете ли вы объяснить часть Лучше защитить свой сервер? - person Praveen Puglia; 21.12.2012
comment
1. Не размещайте каталог загрузки в корневом каталоге документа. 2. Используйте программное обеспечение, такое как AppArmor и другие. 3. Защитите свои серверы... - person Roman Newaza; 21.12.2012
comment
Спасибо, ребята, это все еще локально ... еще даже не начал думать о безопасности, но вы поднимаете некоторые хорошие моменты. Laravel кажется, что в него встроена довольно надежная защита из коробки. - person coryj; 21.12.2012