PHP调用unlink()删除文件报“Is a directory”错误如何解决
问题根因
你遇到的unlink(): is a directory报错核心由两个错误叠加导致:
- 遍历了空的图片路径:你的
$images数组初始化时预设了5个空字符串值,当部分文件上传成功、后续文件校验失败抛出异常时,catch块会遍历所有数组元素,空值拼接路径后刚好指向public/images/目录本身,对目录调用unlink()就会触发该错误。 - 文件移动路径和删除路径不匹配:Lumen中
UploadedFile::move()方法传入相对路径时,默认以项目根目录为基准,你写的move('images', $newName)会把文件存到项目根目录的images文件夹,但删除时你拼接的是public/images路径,二者不一致也会导致文件找不到、或者误判路径的问题。
修复方案
第一步:修正文件移动路径
将move方法的目标路径改为绝对路径,确保文件确实存入public目录下的images文件夹:
// 把原来的move行替换成下面的代码 $request->file($fileKey)->move(public_path('images'), $newName);
如果你的Lumen版本没有内置public_path助手,可以自己在bootstrap/app.php中添加:
if (! function_exists('public_path')) { function public_path($path = '') { return app()->basePath('public') . ($path ? DIRECTORY_SEPARATOR . ltrim($path, DIRECTORY_SEPARATOR) : ''); } }
第二步:修正catch块的删除逻辑
删除前先判断图片路径不为空,避免误删目录:
catch (\Exception $e) { DB::rollBack(); $imagesDir = public_path('images/'); foreach ($images as $image) { // 新增非空判断,过滤未上传的空路径 if (!empty($image) && file_exists($imagesDir . $image)) { $imagesPath = $imagesDir . $image; unlink($imagesPath); } } return response()->json($e->getMessage(), $e->getCode() ?: 500); }
补充优化:新增?: 500判断异常状态码,避免异常未设置code时返回0导致的响应错误。
额外优化建议
你可以直接用Lumen的请求验证规则校验上传文件,无需自己写正则匹配:
$request->validate([ 'mainImg' => 'file|mimes:jpeg,jpg,bmp,png,gif', 'img1' => 'file|mimes:jpeg,jpg,bmp,png,gif', // 其他需要校验的字段规则 ]);
验证不通过会自动抛出异常,不需要你手动判断抛出。
内容的提问来源于stack exchange,提问作者Douglas Jordão
相关产品推荐
相关产品推荐

