74

我从网站上传了很多图片,需要以更好的方式组织文件。因此,我决定按月创建一个文件夹。

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

在我尝试了这个之后,我得到了错误结果。

消息:file_put_contents(upload/promotions/201211/ang232.png):无法打开流:没有这样的文件或目录

如果我试图只将文件放在现有文件夹中,它会起作用。但是,它无法创建新文件夹。

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

4

6 回答 6

163

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);
于 2012-11-14T02:30:38.257 回答
12

修改上述答案以使其更通用,(自动检测并从系统斜杠上的任意文件名创建文件夹)

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();
    }
}
于 2014-03-25T09:10:21.233 回答
4

我一直在使用 Crud Generator 进行 laravel 项目,但这种方法不起作用

@aqm 所以我创建了自己的函数

PHP方式

function forceFilePutContents (string $fullPathWithFileName, string $fileContents)
    {
        $exploded = explode(DIRECTORY_SEPARATOR,$fullPathWithFileName);

        array_pop($exploded);

        $directoryPathOnly = implode(DIRECTORY_SEPARATOR,$exploded);

        if (!file_exists($directoryPathOnly)) 
        {
            mkdir($directoryPathOnly,0775,true);
        }
        file_put_contents($fullPathWithFileName, $fileContents);    
    }

Laravel 方式

不要忘记在文件顶部添加

use Illuminate\Support\Facades\File;

function forceFilePutContents (string $fullPathWithFileName, string $fileContents)
    {
        $exploded = explode(DIRECTORY_SEPARATOR,$fullPathWithFileName);

        array_pop($exploded);

        $directoryPathOnly = implode(DIRECTORY_SEPARATOR,$exploded);

        if (!File::exists($directoryPathOnly)) 
        {
            File::makeDirectory($directoryPathOnly,0775,true,false);
        }
        File::put($fullPathWithFileName,$fileContents);
    }
于 2019-04-03T15:44:48.770 回答
0

我从@Manojkiran.A 和@Savageman 创建了一个更简单的答案。此函数可用作 file_put_contents 的直接替换。它不支持上下文参数,但我认为对于大多数情况应该足够了。我希望这可以帮助一些人。快乐编码!:)

function force_file_put_contents (string $pathWithFileName, mixed $data, int $flags = 0) {
  $dirPathOnly = dirname($pathWithFileName);
  if (!file_exists($directoryPathOnly)) {
    mkdir($dirPathOnly, 0775, true); // folder permission 0775
  }
  file_put_contents($pathWithFileName, $data, $flags);
}
于 2021-08-01T08:42:23.293 回答
0

简单的 Laravel 解决方案:

use Illuminate\Support\Facades\File;

// If the directory does not exist, it will be create
// Works recursively, with unlimited number of subdirectories
File::ensureDirectoryExists('my/super/directory');

// Write file content
File::put('my/super/directory/my-file.txt', 'this is file content');
于 2022-02-08T15:23:52.043 回答
-4

我写了一个你可能喜欢的函数。它被称为 forceDir()。它基本上检查您想要的目录是否存在。如果是这样,它什么也不做。如果没有,它将创建目录。使用这个函数而不只是 mkdir 的一个原因是这个函数也可以创建下一个文件夹。例如('upload/promotions/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)));  
        }
    }
}
于 2014-03-25T09:17:42.040 回答