我从网站上传了很多图片,需要以更好的方式整理文件。 因此,我决定按月创建一个文件夹。
$month = date('Yd')
file_put_contents("upload/promotions/".$month."/".$image, $contents_data);
在我尝试这个之后,我得到了错误结果。
消息:file_put_contents(upload / promotions / 201211 / ang232.png):无法打开流:没有这样的文件或目录
如果我试图只将文件放在存在的文件夹中,那就有效了。但是,它无法创建新文件夹。
有没有办法解决这个问题?
答案 0 :(得分:124)
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);
答案 1 :(得分:7)
修改上面的答案,使其更通用,(自动检测并从系统斜杠上的任意文件名创建文件夹)
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();
}
}
答案 2 :(得分:0)
我一直在使用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);
}
拉拉韦路
别忘了在文件顶部添加
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);
}
答案 3 :(得分: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);
}
答案 4 :(得分:-4)
我写了一个你可能喜欢的功能。它被称为forceDir()。它基本检查你想要的目录是否存在。如果是这样,它什么都不做。如果没有,它将创建目录。使用此函数而不仅仅是mkdir的一个原因是此函数也可以创建nexted文件夹。例如('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)));
}
}
}