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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 09:15:49