nodejs网盘
时间: 2025-06-03 22:30:15 浏览: 20
### 如何用 Node.js 实现网盘功能
要实现基于 Node.js 的网盘功能,可以从以下几个方面入手:
#### 1. **文件上传与下载**
文件上传和下载是网盘的核心功能之一。可以通过 `express` 和 `multer` 这两个库来处理文件的上传操作[^2]。
```javascript
const express = require('express');
const multer = require('multer');
// 创建 Express 应用实例
const app = express();
// 配置 Multer 存储路径
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'uploads/');
},
filename: function (req, file, cb) {
cb(null, Date.now() + '-' + file.originalname);
}
});
const upload = multer({ storage: storage });
// 处理单个文件上传
app.post('/upload', upload.single('file'), (req, res) => {
res.send('File uploaded successfully.');
});
```
对于文件下载,可以利用 `fs` 模块读取文件并将其发送给客户端[^4]。
```javascript
const fs = require('fs');
const path = require('path');
app.get('/download/:filename', (req, res) => {
const filePath = path.join(__dirname, 'uploads/', req.params.filename);
// 检查文件是否存在
fs.access(filePath, fs.constants.F_OK, (err) => {
if (err) {
return res.status(404).send('File not found!');
}
// 发送文件
res.download(filePath, (err) => {
if (err) console.log(err);
});
});
});
```
---
#### 2. **用户认证与权限控制**
用户登录和注册功能可通过 `passport.js` 来实现身份验证,并结合 JWT(JSON Web Token)或 Session 提供持续的身份校验机制[^3]。
```javascript
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy(
{ usernameField: 'email' },
async (username, password, done) => {
try {
let user = await User.findOne({ email: username });
if (!user || !(await bcrypt.compare(password, user.password))) {
return done(null, false, { message: 'Invalid credentials.' });
}
return done(null, user);
} catch (error) {
return done(error);
}
}
));
```
为了保护路由资源不被未授权访问,可以在中间件中加入权限检查逻辑。
```javascript
function isAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
return next();
}
res.redirect('/login');
}
```
---
#### 3. **存储解决方案**
对于大规模应用,本地磁盘可能无法满足需求,因此可以选择云存储服务如 AWS S3、阿里云 OSS 或腾讯云 COS。这些服务提供了 SDK 支持,便于集成到项目中。
以下是使用 AWS S3 的简单示例:
```javascript
const AWS = require('aws-sdk');
AWS.config.update({ region: 'us-west-2' });
const s3 = new AWS.S3();
async function uploadToS3(fileBuffer, fileName) {
const params = {
Bucket: 'your-bucket-name',
Key: fileName,
Body: fileBuffer,
};
return new Promise((resolve, reject) => {
s3.upload(params, (err, data) => {
if (err) reject(err);
resolve(data.Location); // 返回文件 URL
});
});
}
app.post('/s3-upload', upload.single('file'), async (req, res) => {
try {
const url = await uploadToS3(fs.readFileSync(req.file.path), req.file.filename);
res.json({ success: true, url });
} catch (e) {
res.status(500).json({ error: e.message });
}
});
```
---
#### 4. **前端交互**
前端部分可以选用 Vue.js 构建界面并与后端 API 结合工作。例如,展示已上传文件列表以及提供删除选项等功能。
```html
<template>
<div id="app">
<h1>My Files</h1>
<ul>
<li v-for="(file, index) in files" :key="index">{{ file.name }} - {{ file.size | formatBytes }}
<button @click="deleteFile(file.id)">Delete</button>
</li>
</ul>
<form enctype="multipart/form-data" @submit.prevent="uploadFile">
<input type="file" name="file" ref="fileInput" />
<button type="submit">Upload</button>
</form>
</div>
</template>
<script>
export default {
data() {
return {
files: [],
};
},
methods: {
async fetchFiles() {
this.files = await axios.get('/api/files');
},
async deleteFile(id) {
await axios.delete(`/api/file/${id}`);
this.fetchFiles(); // 刷新文件列表
},
async uploadFile() {
const formData = new FormData();
formData.append('file', this.$refs.fileInput.files[0]);
await axios.post('/api/upload', formData, {
headers: { 'Content-Type': 'multipart/form-data' },
});
this.fetchFiles(); // 更新视图
},
},
created() {
this.fetchFiles();
},
};
</script>
```
---
#### 5. **扩展功能**
可以进一步增加以下特性提升用户体验:
- 文件夹支持:允许创建子目录结构。
- 分享链接:生成临时公开链接以便他人查看/下载指定文件。
- 在线预览:针对图片、文档等常见格式启用即时浏览模式。
---
阅读全文
相关推荐












