Создание папки при запуске file_put_contents()
Я загрузил много изображений с веб-сайта и вам лучше организовать файлы.
Поэтому я решаю создать папку по месяцам.
$month = date('Yd')
file_put_contents("upload/promotions/".$month."/".$image, $contents_data);
после того, как я попробовал это, я получаю сообщение об ошибке.
Сообщение: file_put_contents (upload/promotion/201211/ang232.png): не удалось открыть поток: нет такого файла или каталога
Если я попытался поместить только файл в существующую папку, это сработало. Однако создать новую папку не удалось.
Есть ли способ решить эту проблему?
Ответы
Ответ 1
file_put_contents()
не создает структуру каталогов. Только файл.
Вам нужно будет добавить логику к вашему script, чтобы проверить, существует ли каталог месяца. Если нет, сначала используйте mkdir()
.
if (!is_dir('upload/promotions/' . $month)) {
// dir doesn't exist, make it
mkdir('upload/promotions/' . $month);
}
file_put_contents('upload/promotions/' . $month . '/' . $image, $contents_data);
Обновление: mkdir()
принимает третий параметр $recursive
, который создаст любую отсутствующую структуру каталогов. Может быть полезно, если вам нужно создать несколько каталогов.
Пример с рекурсивными правами и правами каталога, установленными на 777:
mkdir('upload/promotions/' . $month, 0777, true);
Ответ 2
изменение вышеуказанного ответа, чтобы сделать его более универсальным (автоматически обнаруживает и создает папку из произвольного имени файла на системных слэшах)
ps предыдущий ответ потрясающий
/**
* create file with content, and create folder structure if doesn't exist
* @param String $filepath
* @param String $message
*/
function forceFilePutContents ($filepath, $message){
try {
$isInFolder = preg_match("/^(.*)\/([^\/]+)$/", $filepath, $filepathMatches);
if($isInFolder) {
$folderName = $filepathMatches[1];
$fileName = $filepathMatches[2];
if (!is_dir($folderName)) {
mkdir($folderName, 0777, true);
}
}
file_put_contents($filepath, $message);
} catch (Exception $e) {
echo "ERR: error writing '$message' to '$filepath', ". $e->getMessage();
}
}
Ответ 3
Я написал функцию, которая вам может понравиться. Он называется forceDir(). Он в основном проверяет, существует ли существующий каталог. Если это так, он ничего не делает. Если нет, он создаст каталог. Причина использования этой функции, а не просто mkdir, заключается в том, что эта функция также может создавать следующие папки. Например ('upload/promotionions/januari/firstHalfOfTheMonth'). Просто добавьте путь к нужному пути dir_path.
function forceDir($dir){
if(!is_dir($dir)){
$dir_p = explode('/',$dir);
for($a = 1 ; $a <= count($dir_p) ; $a++){
@mkdir(implode('/',array_slice($dir_p,0,$a)));
}
}
}