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
相关产品推荐
相关产品推荐

