Laravel 6如何正确返回本地图片?解决FileNotFoundException异常
response()->file()的FileNotFoundException问题 嘿,我来帮你搞定这个找不到文件的问题!你遇到的问题根源在于response()->file()需要的是文件的绝对路径,而你直接传入的$item->file_name_and_path是相对路径,Laravel没法自动定位到storage/app目录下的文件。
下面给你两种简单靠谱的解决方案:
方案一:用Laravel的Storage类生成正确路径
因为你用的是本地驱动,默认的本地存储根目录就是storage/app,直接用Storage::path()方法就能把你的相对路径转换成完整的绝对路径:
public function showImage($id) { $item = File::find($id); // 自动拼接出正确的绝对路径 $filePath = Storage::path($item->file_name_and_path); return response()->file($filePath); }
这个方法会帮你把files/2020/04/29/myfile.jpeg自动拼接成{laravel root}/storage/app/files/2020/04/29/myfile.jpeg,完美匹配你的文件实际存储位置。
方案二:用辅助函数手动拼接路径
如果你不想依赖Storage类,也可以用storage_path()辅助函数直接拼接路径:
public function showImage($id) { $item = File::find($id); $filePath = storage_path('app/' . $item->file_name_and_path); return response()->file($filePath); }
storage_path('app/')会返回Laravel项目根目录下的storage/app/绝对路径,加上你的相对路径后同样能精准定位到目标文件。
另外补充个小提示:如果这些图片需要公开让用户直接通过URL访问,更规范的做法是在项目根目录执行php artisan storage:link创建软链接,把storage/app/public映射到public/storage,然后把文件存在storage/app/public目录下,用Storage::url()生成访问链接。不过就你当前的需求——直接返回带HTTP头的图片文件来说,上面两种方案已经完全够用啦。
内容的提问来源于stack exchange,提问作者netdjw

