Laravel上传jpg文件报failed to open stream无此文件或目录如何修复
问题原因
报错日志中的目标路径为/var/www/html/testdreamhunt/storageapp/public/huntSchedule/09132021101356_photo1.PNG,可以看到storage和app两个目录名称直接拼接成了storageapp,缺少路径分隔符,导致系统找不到对应目录。
具体问题点
storage_path()函数返回的路径末尾默认不带斜杠,直接拼接app/public/huntSchedule会触发路径拼接错误- 未提前校验目标目录是否存在,若
huntSchedule目录未提前创建,也会触发同类报错 - Laravel上传文件实例不推荐用
File::copy处理,自带的move方法适配上传文件的处理逻辑,稳定性更高
修复后代码
if(array_key_exists('fileToUpload', $request->all())) { $access_time = Carbon::now()->format('mdYHis'); // 用系统常量DIRECTORY_SEPARATOR拼接路径,兼容Windows、Linux等不同操作系统 $directory = storage_path() . DIRECTORY_SEPARATOR . 'app' . DIRECTORY_SEPARATOR . 'public' . DIRECTORY_SEPARATOR . 'huntSchedule'; // 目录不存在时递归创建,设置目录权限为755 if(!\File::exists($directory)) { \File::makeDirectory($directory, 0755, true); } $files = $request->fileToUpload; $filename = $access_time.'_photo'.Auth::user()->id.'.'.$files->getClientOriginalExtension(); // 调用上传文件实例的move方法完成文件移动 $files->move($directory, $filename); $schedule->photo = 'storage/huntSchedule/'.$filename; }
额外优化建议
你也可以直接用Laravel自带的Storage门面处理上传逻辑,无需手动拼接路径,只要提前执行php artisan storage:link创建存储软链即可。
内容的提问来源于stack exchange,提问作者Kirit Pendyala
相关产品推荐
相关产品推荐

