如何修复Laravel中‘failed to open stream’错误及图片上传流错误
一、先搞定你的文件上传错误:HTTP wrapper不支持写入
兄弟,你这段代码的问题一眼就能看出来——你用asset()生成的是给前端用的HTTP网址(比如http://your-site.com/assets/images/excavator/xxx.png),但move_uploaded_file()是要往服务器的本地硬盘里写文件,它认的是服务器上的物理路径,不是网络地址,这不就冲突了嘛!
给你改好的代码,直接用:
$image_src = $_FILES['ex_image']['tmp_name']; // 用Laravel的public_path()获取本地目录路径,这才是move_uploaded_file需要的 $dest_path = public_path('assets/images/excavator/' . $title . '.png'); // 重要!先确保目标目录存在,不然又会触发"failed to open stream"错误 mkdir(dirname($dest_path), 0755, true); // 现在再移动文件就没问题了 move_uploaded_file($image_src, $dest_path); // 如果需要给前端返回访问URL,这时候再用asset()生成 $src = asset('assets/images/excavator/' . $title . '.png');
额外提醒:记得给服务器上的public/assets/images/excavator目录设置写入权限,一般设成0755就够了,别用0777(不安全)。本地开发的话,Windows右键目录改权限,Linux用chmod -R 755 目录路径。
二、搞定Laravel里的"failed to open stream"通用错误
这个错误本质就是PHP找不到文件/目录,或者没权限操作,常见场景和解决方法给你列出来:
1. 路径写错了
很多人用相对路径踩坑,比如直接写assets/images/xxx,但PHP的工作目录不一定是你想的那个。解决办法:
- 一律用Laravel提供的路径辅助函数:
base_path()(项目根目录)、public_path()(public目录)、storage_path()(storage目录),绝对不会错。
2. 权限不够
Laravel的storage和bootstrap/cache目录必须要有写入权限,不然缓存、日志、文件存储都会报错。Linux服务器执行这俩命令:
chmod -R 755 storage bootstrap/cache chown -R www-data:www-data storage bootstrap/cache
(www-data是Nginx/Apache的用户,如果你用的是其他服务器用户,换成对应的就行)
3. 存储链接没创建
如果是访问storage/app/public里的文件报错,那是因为你没创建符号链接。执行Artisan命令:
php artisan storage:link
这个命令会在public目录下生成一个指向storage/app/public的链接,这样前端才能访问到storage里的公开文件。
4. Composer自动加载缓存问题
如果是加载类文件时报错,比如Class not found伴随这个错误,执行:
composer dump-autoload
重新生成自动加载文件就能解决。
内容的提问来源于stack exchange,提问作者HarryLyu

