Laravel 5.8图片上传报错:Image source not readable 问题咨询
解决Image source not readable错误的方案
我来帮你排查这个Image source not readable的问题,看了你的代码后,发现几个关键的错误点导致了这个问题:
问题分析
- 文件移动路径错误:你调用
$image->move(public_path('img'.$fileName))时,把目录和文件名直接拼接成了一个完整路径(比如public/imgtest.jpg),但move()方法的第一个参数应该是目标目录,第二个参数才是文件名。这种写法会让系统尝试把整个字符串当作目录去创建,最终导致文件没有被放到正确的位置。 - 图片处理路径不匹配:生成缩略图时你用了
$destination . '/' . $fileName,但之前移动文件时根本没用到$destination变量,而是用了错误的路径,所以Image类找不到要处理的源文件,自然抛出了“source not readable”的错误。
修复后的代码
private function handleRequest($request) { $data = $request->all(); if ($request->hasFile('image')) { $image = $request->file('image'); // 加上时间戳前缀避免同名文件覆盖 $fileName = time() . '_' . $image->getClientOriginalName(); $destination = public_path('img'); // 提前创建目录并确保写入权限 if (!file_exists($destination)) { mkdir($destination, 0755, true); } // 正确调用move方法:第一个参数是目标目录,第二个是文件名 $successUploaded = $image->move($destination, $fileName); if ($successUploaded) { $extension = $image->getClientOriginalExtension(); $thumbnail = str_replace(".{$extension}", "_thumb.{$extension}", $fileName); // 路径匹配后可以正确读取源文件 Image::make($destination . '/' . $fileName) ->resize(250, 170) ->save($destination . '/' . $thumbnail); } $data['image'] = $fileName; } return $data; }
额外注意事项
- 确保
public/img目录有写入权限,服务器通常需要给目录设置0755或0777权限(根据你的服务器配置调整)。 - 我给文件名加了
time()前缀,避免不同用户上传同名文件时覆盖已有文件,这个小优化能避免很多潜在问题。 - 可以加上文件验证逻辑,比如用
$image->isValid()检查文件是否有效,用$image->getMimeType()确保上传的是图片类型,防止恶意文件上传。
内容的提问来源于stack exchange,提问作者Brian Kigo
相关产品推荐
相关产品推荐

