Создание папки при запуске file_put_contents ()

Я загрузил много изображений с веб-сайта, и вам лучше организовать файлы. Поэтому я решаю создать папку по месяцам.

$month = date('Yd') file_put_contents("upload/promotions/".$month."/".$image, $contents_data); 

после того, как я попробовал это, я получаю сообщение об ошибке.

Сообщение: file_put_contents (upload / promotion / 201211 / ang232.png): не удалось открыть поток: нет такого файла или каталога

Если я попытался поместить только файл в существующую папку, это сработало. Однако создать новую папку не удалось.

Есть ли способ решить эту проблему?

file_put_contents() не создает структуру каталогов. Только файл.

Вам нужно будет добавить логику в свой скрипт, чтобы проверить, существует ли каталог месяца . Если нет, сначала используйте 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); 

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

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(); } } 

Я написал функцию, которая вам может понравиться. Он называется 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))); } } }