如何在Node.js中通过API批量删除目录中的指定文件?
Node.js 基于fs.unlink实现批量文件删除的Web API方案
核心思路
通过封装异步处理逻辑,结合fs.promises.unlink(Promise版本的unlink,适配批量异步场景)完成需求:接收Web API传来的待删文件列表,先校验文件是否在指定目录(同时防范路径遍历风险),再逐个执行删除并返回结果。
实现步骤
1. 依赖准备与基础服务搭建
先安装Express框架(也可替换为其他Web框架):
npm install express
创建基础服务:
const express = require('express'); const fs = require('fs').promises; const path = require('path'); const app = express(); // 解析JSON格式请求体 app.use(express.json()); // 指定允许删除的根目录(根据实际需求修改) const ALLOWED_DELETE_DIR = path.resolve(__dirname, 'target-files'); app.listen(3000, () => { console.log('Server running on port 3000'); });
2. 封装批量删除核心函数
这个函数负责路径合法性校验、文件存在性检查及批量删除操作:
async function batchDelete(fileList) { const operationResults = []; for (const fileName of fileList) { // 拼接绝对路径,避免路径遍历攻击 const fullFilePath = path.resolve(ALLOWED_DELETE_DIR, fileName); // 校验文件是否在允许的目录范围内 if (!fullFilePath.startsWith(ALLOWED_DELETE_DIR)) { operationResults.push({ fileName, status: 'failed', msg: '非法路径,禁止删除' }); continue; } try { // 检查文件是否存在 await fs.access(fullFilePath, fs.constants.F_OK); // 执行删除 await fs.unlink(fullFilePath); operationResults.push({ fileName, status: 'success', msg: '删除成功' }); } catch (err) { let errorMsg = '删除失败'; if (err.code === 'ENOENT') { errorMsg = '文件不存在'; } else if (err.code === 'EACCES') { errorMsg = '无权限删除该文件'; } operationResults.push({ fileName, status: 'failed', msg: errorMsg }); } } return operationResults; }
3. 实现Web API接口
添加POST接口接收删除请求:
app.post('/api/batch-delete', async (req, res) => { const { files } = req.body; // 校验请求参数合法性 if (!Array.isArray(files) || files.length === 0) { return res.status(400).json({ success: false, msg: '请传入有效的待删除文件列表' }); } try { const deleteResults = await batchDelete(files); res.json({ success: true, results: deleteResults }); } catch (err) { res.status(500).json({ success: false, msg: '服务器内部错误' }); } });
关键注意事项
- 路径安全:必须用
path.resolve拼接绝对路径,并校验是否在允许目录内,防止恶意用户通过../遍历删除其他目录文件。 - 异步处理:使用
fs.promises结合async/await,避免回调地狱,让批量操作逻辑更清晰。 - 错误细分:根据不同错误码返回对应提示,方便前端处理不同失败场景。
测试示例
用curl测试接口:
curl -X POST http://localhost:3000/api/batch-delete \ -H "Content-Type: application/json" \ -d '{"files": ["note.txt", "avatar.png", "not-exist.pdf"]}'
返回结果示例:
{ "success": true, "results": [ { "fileName": "note.txt", "status": "success", "msg": "删除成功" }, { "fileName": "avatar.png", "status": "success", "msg": "删除成功" }, { "fileName": "not-exist.pdf", "status": "failed", "msg": "文件不存在" } ] }
内容的提问来源于stack exchange,提问作者Hardik Patel
相关产品推荐
相关产品推荐

