Laravel使用intervention/image处理预览图后如何获取路径存入数据库
报错原因
你触发报错的根本原因是$img->save($path)返回的是Intervention Image实例对象,而非路径字符串。你直接将对象赋值给Eloquent模型字段,模型后续序列化转JSON时就会抛出UTF-8编码异常。
解决方法
你模型中定义的预览图访问器逻辑要求存储的是Storage磁盘对应的相对路径,和主图存储规则保持一致即可,修正后的控制器代码如下:
if ($request->hasFile('preview_image')) { $file = $request->file('preview_image'); $namewithextension = $file->getClientOriginalName(); $name = explode('.', $namewithextension)[0]; $extension = $file->getClientOriginalExtension(); $uploadname = $name. '-' .DateTime::createFromFormat('U.u', microtime(TRUE))->format('U-u') . '.' .$extension; // 定义和主图规则对齐的相对存储路径 $relativePath = 'public/article-block-image/preview/' . $uploadname; // 拼接完整本地路径用于保存处理后的图片 $fullSavePath = public_path('storage/article-block-image/preview/'. $uploadname); // 处理并保存图片 Image::make($file)->resize(240, 120)->save($fullSavePath); // 给模型字段赋值相对路径 $article_block_image->preview_image = $relativePath; }
逻辑说明
- 该写法和主图的存储规则完全对齐,存入数据库的是
public/xxx格式的相对路径,完全适配你已经写好的getPreviewImageAttribute访问器逻辑,不需要修改模型层代码即可正常获取预览图URL。 - 不要尝试直接将
save()方法的返回值赋值给模型字段,该方法返回Image实例用于链式调用,本身不是路径字符串。
内容的提问来源于stack exchange,提问作者user16993770
相关产品推荐
相关产品推荐

