Laravel使用File::makeDirectory创建相册文件夹时报mkdir错误
嘿,这个mkdir报错的问题我太熟了!大概率是你构建的路径不对,导致Laravel跑到错误的目录下去创建文件夹了,我给你一步步捋清楚怎么解决:
问题根源
你的报错路径指向了Laravel的vendor目录,说明你代码里的路径没有正确指向项目的storage目录,而是用了相对路径或者错误的绝对路径,导致系统去不该去的地方找文件夹,自然找不到。
正确的解决步骤
用Laravel辅助函数构建绝对路径
Laravel提供了storage_path()辅助函数,能帮你精准指向项目的storage目录。你要创建的是storage/app/public/albums/{$albumName}文件夹,所以路径应该这么写:$albumPath = storage_path("app/public/albums/{$albumName}");这个函数会自动拼接你的项目根目录,生成正确的绝对路径,比如你的项目在
C:\MAMP\htdocs\LaravelProject,那生成的路径就是C:\MAMP\htdocs\LaravelProject\storage\app\public\albums\你的相册名,绝对不会错。开启递归创建父目录
如果你还没创建过albums这个父文件夹,直接创建子文件夹会报错,所以调用File::makeDirectory时要加上第二个参数true(开启递归创建),第三个参数设置文件夹权限(一般用0755就行)。完整代码示例:use Illuminate\Support\Facades\File; $albumName = "你的相册名称"; // 替换成你的变量 $albumPath = storage_path("app/public/albums/{$albumName}"); if (!File::exists($albumPath)) { // 第三个参数true表示递归创建所有不存在的父目录 File::makeDirectory($albumPath, 0755, true); }确认软链接是否正常
虽然你执行了php artisan storage:link,但还是检查一下项目的public目录下有没有storage这个软链接,它应该指向../storage/app/public。如果链接失效或者没创建成功,重新执行命令:php artisan storage:link(Windows系统如果执行失败,可能需要用管理员权限打开命令提示符,或者手动用
mklink命令创建链接)检查文件夹权限
确保你的storage目录及其子目录有读写权限:- Linux/Mac系统可以执行:
chmod -R 755 storage/ - Windows系统右键点击storage文件夹,选择“属性”-“安全”,给当前用户设置写入权限
- Linux/Mac系统可以执行:
为什么之前会报错?
如果你的代码里直接用了类似"albums/{$albumName}"的相对路径,Laravel会把它当成相对于当前执行脚本的路径,而当前脚本可能在vendor/laravel/framework/src/Illuminate/...目录下,所以系统会去那个目录找albums文件夹,自然找不到,就报了"No such file or directory"的错误。
内容的提问来源于stack exchange,提问作者Onyx

