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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:30:47