如何通过Node.js、express-fileupload将文件上传至群晖NAS共享文件夹
使用Node.js + express-fileupload上传文件到NAS的可行性方案
完全可行,核心根据NAS的访问方式分两种场景处理:
一、NAS已挂载到服务器本地文件系统
如果你的NAS通过SMB/NFS等协议挂载到了运行Node.js服务的服务器本地(比如Linux下挂载到/mnt/nas,Windows下映射为Z盘),那么操作和上传到本地文件夹完全一致,express-fileupload可以直接将文件存到挂载路径。
示例代码:
const express = require('express'); const fileUpload = require('express-fileupload'); const fs = require('fs/promises'); const path = require('path'); const app = express(); app.use(fileUpload({ createParentPath: true })); app.post('/upload', async (req, res) => { try { if (!req.files || Object.keys(req.files).length === 0) { return res.status(400).send('没有上传文件'); } // 假设NAS挂载到本地的路径是 /mnt/nas/uploads const targetDir = '/mnt/nas/uploads'; const uploadedFile = req.files.file; const targetPath = path.join(targetDir, uploadedFile.name); // 将文件移动到NAS挂载目录 await uploadedFile.mv(targetPath); res.send(`文件已上传到NAS: ${targetPath}`); } catch (err) { res.status(500).send(err.message); } }); app.listen(3000, () => console.log('服务启动在3000端口'));
注意:要确保运行Node.js进程的用户拥有NAS挂载目录的读写权限,否则会出现权限错误。
二、NAS未挂载,直接通过网络协议访问
如果NAS没有挂载到本地,你需要通过对应的网络协议(SMB/NFS等)直接访问,这时候path模块无法直接处理网络路径(因为它只负责本地文件系统路径解析),需要使用专门的Node.js库:
针对SMB协议的示例(使用@sabaki/smb-client)
const express = require('express'); const fileUpload = require('express-fileupload'); const { SmbClient } = require('@sabaki/smb-client'); const app = express(); app.use(fileUpload()); const nasConfig = { host: '你的NAS IP', share: '共享文件夹名称', domain: 'WORKGROUP', // 一般默认是WORKGROUP username: 'NAS用户名', password: 'NAS密码' }; app.post('/upload', async (req, res) => { try { if (!req.files) return res.status(400).send('没有上传文件'); const uploadedFile = req.files.file; const client = new SmbClient(nasConfig); // 连接NAS并上传文件 await client.connect(); await client.writeFile(`/${uploadedFile.name}`, uploadedFile.data); await client.disconnect(); res.send('文件已上传到NAS'); } catch (err) { res.status(500).send(err.message); } }); app.listen(3000, () => console.log('服务启动在3000端口'));
针对NFS协议
可以使用nfs包,核心逻辑类似:通过NFS客户端连接NAS共享目录,将上传的文件数据写入指定路径。
关于path模块无法连接NAS的问题
path模块的作用是解析、拼接本地文件系统的路径,它本身不具备网络连接能力,所以无法直接用来访问NAS服务器。你需要:
- 要么将NAS挂载到本地,把NAS路径当作本地路径用
path处理; - 要么使用对应网络协议的客户端库,直接通过网络操作NAS文件。
内容的提问来源于stack exchange,提问作者Elliotlafave
相关产品推荐
相关产品推荐

