当我运行file_put_contents()时创build一个文件夹

我从网站上传了很多图片,需要更好地整理文件。 因此,我决定在几个月内创build一个文件夹。

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

我试过这个之后,得到错误的结果。

消息:file_put_contents(上传/ promotions / 201211 / ang232.png):未能打开stream:没有这样的文件或目录

如果我试图把只有文件存在文件夹,它的工作。 但是,它无法创build一个新的文件夹。

有没有办法解决这个问题?

file_put_contents()不会创build目录结构。 只有文件。

您将需要添加逻辑到脚本来testing月份目录是否存在。 如果没有,首先使用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的第三个参数,这将创build任何缺less的目录结构。 如果你需要创build多个目录,可能会很有用。

recursion和目录权限设置为777的示例:

 mkdir('upload/promotions/' . $month, 0777, true); 

修改上面的答案,使其更通用一点,(自动检测和创build系统斜杠上的任意文件名的文件夹)

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()。 它基本上检查你想要的目录是否存在。 如果是这样,它什么都不做。 如果不是,它将创build该目录。 使用这个函数的原因,而不是只是mkdir,这个函数也可以创buildnexted文件夹。例如('upload / promotions / januari / firstHalfOfTheMonth')。 只需将path添加到所需的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))); } } }