Laravel Excel导出图片报错:存储路径文件无法找到的解决咨询
解决Laravel Excel导出带图片Excel时PHPExcel_Exception文件找不到的问题
这个报错的核心原因是:你使用的老版本Laravel Excel(基于PHPExcel)在处理图片时,无法通过HTTP URL可靠地读取图片资源——哪怕浏览器能打开这个URL,PHP可能因为配置限制(比如allow_url_fopen关闭)或者权限问题,无法通过HTTP请求获取到本地服务器上的文件。
下面是两种可行的解决方案:
方案一:改用本地文件路径替代HTTP URL
直接在视图中使用图片的本地绝对路径,让PHPExcel可以直接读取本地文件,而不是通过HTTP请求获取。
修改视图中的图片代码:
{{-- 替换原来的asset()生成的URL,改用public_path获取本地绝对路径 --}} <img src="{{ public_path('storage/photos/' . $car->lot_id . '/1.jpg') }}" width="80px">
注意事项:
- 确保你已经执行过
php artisan storage:link,把storage/app/public目录软链接到public/storage,这样public_path('storage/...')才能正确指向对应的文件。 - 检查服务器运行用户(比如
www-data)是否拥有读取storage/app/public/photos目录下文件的权限。
方案二:手动在Excel中插入图片(更可靠)
如果方案一还是有问题,你可以在控制器中手动遍历数据,将图片插入到Excel的指定单元格位置,完全避开视图中img标签的路径问题。
修改控制器代码:
use Illuminate\Support\Facades\File; public function WholeSaleStockExport(Request $request, BidFilters $filters) { Excel::create('name: ' . date("Y/m/d"), function($excel ) use($filters, $request) { $excel->sheet('today', function($sheet) use($filters, $request) { $bid = ClientCar::filter($filters)->orderBy('lot_date', 'ASC')->get(); $sheet->loadView('manager.sheets.wholesale', array('cars' => $bid)); // 手动插入图片到指定单元格(假设图片放在D列,数据从第2行开始) $row = 2; foreach ($bid as $car) { $imagePath = storage_path('app/public/photos/' . $car->lot_id . '/1.jpg'); // 先检查文件是否存在,避免报错 if (File::exists($imagePath)) { // insertImage(文件路径, 单元格位置, 宽度, 高度) $sheet->insertImage($imagePath, 'D' . $row, 80, 80); } $row++; } }); })->download('xls'); }
然后可以把视图中的<img>标签移除,因为手动插入的图片会直接显示在Excel的对应位置。
额外排查点
如果以上方案都无效,可以检查:
- PHP配置中的
allow_url_fopen是否开启(不过还是推荐用本地路径,开启这个配置有安全风险); - 确认图片的本地路径完全正确,可以通过
dd(storage_path('app/public/photos/' . $car->lot_id . '/1.jpg'))输出路径,然后在服务器上验证该文件是否存在。
内容的提问来源于stack exchange,提问作者Dmitry Malys
相关产品推荐
相关产品推荐

