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

Node服务器如何将接收的文件跨服务器转发至独立文件存储服务

问题解答

不能通过修改__dirname相关配置的方式将文件发送到独立存储站点。

__dirname是Node.js原生提供的、指向当前执行脚本所在本地目录的绝对路径变量,仅能操作当前服务器自身的本地文件系统,完全无法访问远程服务器的存储资源,修改它不可能实现跨服务器文件传输。

要实现把上传的文件转存到独立存储服务器,只需要两台服务器配合:存储服务器开放专属文件上传接口,业务上传服务器收到用户上传的文件后,再通过HTTP请求把文件转发到存储服务器即可。


实现示例

1. 存储服务器(StoreFile.com)端代码

在存储服务器部署express + express-fileupload服务,开放专门的文件接收接口,把文件存在业务代码目录之外的独立存储路径,避免服务更新时被覆盖:

const express = require('express');
const fileUpload = require('express-fileupload');
const path = require('path');
const fs = require('fs');
const app = express();

// 初始化独立存储目录,放在代码部署目录外更稳妥
const STORE_PATH = '/data/file-storage/';
if (!fs.existsSync(STORE_PATH)) fs.mkdirSync(STORE_PATH, { recursive: true });

app.use(fileUpload({
  limits: { fileSize: 50 * 1024 * 1024 } // 按需调整文件大小限制,示例为50MB
}));

// 文件接收接口,生产环境记得加鉴权/IP白名单
app.post('/receive-file', (req, res) => {
  try {
    if (!req.files || !req.files.uploadFile) {
      return res.status(400).send({ code: 1, msg: '未接收到文件' });
    }
    const file = req.files.uploadFile;
    // 加时间戳前缀避免重名文件覆盖
    const savePath = path.join(STORE_PATH, `${Date.now()}_${file.name}`);
    file.mv(savePath, (err) => {
      if (err) {
        console.error('存储文件失败:', err);
        return res.status(500).send({ code: 1, msg: '存储失败' });
      }
      // 返回文件存储信息供业务服务器使用
      res.send({
        code: 0,
        msg: '存储成功',
        data: {
          originName: file.name,
          savePath: savePath
        }
      });
    });
  } catch (e) {
    console.error('接口异常:', e);
    res.status(500).send({ code: 1, msg: '服务异常' });
  }
});

app.listen(3002, () => {
  console.log('存储服务运行在端口3002');
});

2. 原业务上传服务器(Uploadfile.com)端改造代码

不再把文件存到本地__dirname对应目录,收到用户上传的文件后,通过form-data格式把文件转发到存储服务器接口:

const express = require('express');
const fileUpload = require('express-fileupload');
const FormData = require('form-data');
const axios = require('axios');
const app = express();

app.use(fileUpload());

// 原用户上传接口
app.post('/upload', async (req, res) => {
  try {
    if (!req.files || !req.files.fle) {
      return res.send('ERROR: 未接收到上传文件');
    }
    const file = req.files.fle;

    // 构造转发请求的表单数据
    const form = new FormData();
    form.append('uploadFile', file.data, file.name);

    // 转发文件到存储服务器
    const storeRes = await axios.post('http://存储服务器实际IP:3002/receive-file', form, {
      headers: {
        ...form.getHeaders(),
        // 这里可以加你设置的接口鉴权密钥
        'X-Secret-Key': '你自定义的接口校验密钥'
      },
      timeout: 10000
    });

    if (storeRes.data.code !== 0) {
      throw new Error('存储服务器返回错误');
    }

    // 后续自定义业务逻辑,比如把文件信息存入数据库等
    res.send('上传成功');
  } catch (err) {
    console.log('上传失败:', err);
    res.send('ERROR');
  }
});

app.listen(3001, () => {
  console.log('业务上传服务运行在端口3001');
});

依赖安装命令

两台服务器分别安装对应运行依赖:

# 存储服务器执行
npm i express express-fileupload

# 业务上传服务器执行
npm i express express-fileupload axios form-data

生产环境注意:存储服务器的接收接口一定要加鉴权校验或者IP白名单,避免被恶意上传垃圾文件占用存储。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:21:27