PHP本地及远程服务器删除目录图片unlink报错问题
核心报错原因
之前的代码跑不通是三个硬伤:
unlink()是PHP文件系统函数,只能操作服务器本地的物理文件路径,你最早拿到的$_POST['src']是带http://前缀的网络URL,不是本地路径,所以会报「http does not allow unlinking」的错误。- 后续拼接路径时,没有把URL里的协议、域名部分剔除,直接把完整URL拼到了
DOCUMENT_ROOT后面,才生成了带http://localhost的无效本地路径,自然找不到文件。 - 原代码的成功判断逻辑完全错误:只要解析出的文件名不为空就提示删除成功,根本没校验
unlink()的实际执行结果,所以才会出现报文件不存在,前端还收到删除成功提示的情况。
兼容本地/远程环境的可直接用代码
把下面的代码替换到你的editor-delete.php文件中即可,不需要针对本地或线上环境改路径:
<?php // 拦截非POST请求 if ($_SERVER['REQUEST_METHOD'] !== 'POST') { http_response_code(405); exit('请求方式不允许'); } // 校验必传参数 if (empty(trim($_POST['src'] ?? ''))) { http_response_code(400); exit('缺少图片路径参数'); } $src = trim($_POST['src']); // 从图片URL中提取站点相对路径,自动剔除协议、域名部分 // 例如将http://localhost/user/blog/uploads/img-uploads/154_20220702.png 转换为 /user/blog/uploads/img-uploads/154_20220702.png $sitePath = parse_url($src, PHP_URL_PATH); // 安全校验:仅允许删除上传目录下的文件,防范路径遍历攻击 if (strpos($sitePath, '/blog/uploads/img-uploads/') === false) { http_response_code(403); exit('非法操作,无权限删除该路径文件'); } // 拼接服务器本地物理绝对路径 $localFilePath = $_SERVER['DOCUMENT_ROOT'] . $sitePath; // 校验文件是否存在 if (!file_exists($localFilePath) || !is_file($localFilePath)) { http_response_code(404); exit('目标图片不存在'); } // 执行删除操作 if (unlink($localFilePath)) { echo '文件删除成功'; } else { http_response_code(500); exit('删除失败,请检查上传目录的读写权限'); } ?>
部署注意事项
- 本地XAMPP环境、线上Windows/Linux服务器都可以直接用这套代码,
$_SERVER['DOCUMENT_ROOT']会自动读取对应环境的站点根目录,parse_url会自动适配不同域名,不需要写死路径。 - 确保
img-uploads目录给Web服务运行用户分配了读写权限:本地XAMPP默认权限一般没问题,线上环境如果是Linux系统,需要给目录分配www-data或nginx对应的用户权限,否则会删除失败。 - 不要删除代码里的路径白名单校验逻辑,这段逻辑可以防止恶意用户构造参数删除站点其他目录下的敏感文件。
内容的提问来源于stack exchange,提问作者emss
相关产品推荐
相关产品推荐

