Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 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)));  
        }
    }
}