Я загрузил много изображений с веб-сайта, и вам лучше организовать файлы. Поэтому я решаю создать папку по месяцам.
$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))); } } }