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

如何在Node.js中创建localhost:8000/file端点以接收文件并本地存储?

实现Node.js文件上传端点(localhost:8000/file)的完整方案

嘿,这事儿不难,咱用Express框架搭配multer中间件就能轻松搞定,这也是Node.js里处理文件上传最常用的组合了。下面是一步步的具体实现:

1. 初始化项目并安装依赖

首先得先创建一个项目文件夹,然后初始化npm,再安装需要的包:

# 创建项目文件夹并进入
mkdir file-upload-server && cd file-upload-server

# 初始化npm(一路回车就行)
npm init -y

# 安装Express和multer
npm install express multer

2. 编写核心代码

在项目根目录下创建server.js文件,把下面的代码复制进去,我会给你逐段解释:

// 引入需要的模块
const express = require('express');
const multer = require('multer');
const path = require('path');
const fs = require('fs');

// 创建Express实例
const app = express();

// 自动创建uploads文件夹(避免手动创建的麻烦)
const uploadsDir = path.join(__dirname, 'uploads');
if (!fs.existsSync(uploadsDir)) {
  fs.mkdirSync(uploadsDir);
}

// 配置multer的存储路径和文件名规则
const storage = multer.diskStorage({
  // 存储文件的本地路径
  destination: function (req, file, cb) {
    cb(null, uploadsDir);
  },
  // 设置保存的文件名,加时间戳避免重名冲突
  filename: function (req, file, cb) {
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
    cb(null, `${uniqueSuffix}-${file.originalname}`);
  }
});

// 创建multer实例,添加基础限制和过滤规则
const upload = multer({ 
  storage: storage,
  limits: { fileSize: 10 * 1024 * 1024 }, // 限制文件最大10MB
  fileFilter: function (req, file, cb) {
    // 这里可以自定义允许的文件类型,比如只允许图片
    const allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'application/pdf'];
    if (allowedTypes.includes(file.mimetype)) {
      cb(null, true);
    } else {
      cb(new Error('仅支持上传JPG/PNG/GIF/PDF类型的文件'));
    }
  }
});

// 定义POST请求的/file端点,upload.single('file')表示接收名为file的单个文件
app.post('/file', upload.single('file'), (req, res) => {
  // 如果没有接收到文件,返回错误提示
  if (!req.file) {
    return res.status(400).json({ message: '请选择要上传的文件' });
  }

  // 返回成功信息,包含文件的存储路径和文件名
  res.status(200).json({
    message: '文件上传成功',
    fileName: req.file.filename,
    storedPath: req.file.path,
    fileSize: `${(req.file.size / 1024).toFixed(2)} KB`
  });
});

// 全局错误处理中间件,捕获上传过程中的异常
app.use((err, req, res, next) => {
  if (err instanceof multer.MulterError) {
    return res.status(400).json({ message: `文件上传错误:${err.message}` });
  } else if (err) {
    return res.status(400).json({ message: err.message });
  }
  next();
});

// 启动服务器,监听8000端口
const PORT = 8000;
app.listen(PORT, () => {
  console.log(`服务器运行在 http://localhost:${PORT}`);
});

3. 测试端点

你可以用Postman、curl或者其他API工具来测试:

  • 如果用curl的话,在终端里输入下面的命令(把/path/to/your/test.pdf换成你本地的文件路径):
curl -X POST -F "file=@/path/to/your/test.pdf" http://localhost:8000/file

如果上传成功,你会收到类似这样的响应:

{
  "message": "文件上传成功",
  "fileName": "1699999999999-123456789-test.pdf",
  "storedPath": "/Users/xxx/file-upload-server/uploads/1699999999999-123456789-test.pdf",
  "fileSize": "245.67 KB"
}

4. 额外提示

  • 如果需要支持多文件上传,把upload.single('file')换成upload.array('files', 5)(表示最多上传5个文件),然后在处理函数里用req.files获取所有文件信息。
  • 生产环境中建议把文件存储到云存储(比如OSS、S3),而不是本地服务器,避免服务器存储不足的问题。

内容的提问来源于stack exchange,提问作者razzv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:00:53