You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP调用unlink()删除文件报“Is a directory”错误如何解决

问题根因

你遇到的unlink(): is a directory报错核心由两个错误叠加导致:

  1. 遍历了空的图片路径:你的$images数组初始化时预设了5个空字符串值,当部分文件上传成功、后续文件校验失败抛出异常时,catch块会遍历所有数组元素,空值拼接路径后刚好指向public/images/目录本身,对目录调用unlink()就会触发该错误。
  2. 文件移动路径和删除路径不匹配: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 18:15:03