实现Node.js上传功能的过程包括以下几个步骤:
- 使用Node.js的内置模块http模块或express框架创建http服务;
- 使用formidable或multer等Node.js模块解析上传文件;
- 对上传文件进行存储、检查、处理;
- 响应上传结果。
下面将详细讲解这些步骤,以及两个实例说明。
一、创建http服务
我们可以使用Node.js提供的内置模块http,或者使用常用的express框架,来创建http服务。
1.1. 使用http模块创建http服务
使用http模块创建http服务的代码如下:
const http = require('http');
http.createServer((req, res) => {
// 在此处处理上传文件
}).listen(8080, () => {
console.log('Server is running at http://localhost:8080');
});
1.2. 使用express框架创建http服务
使用express框架创建http服务的代码如下:
const express = require('express');
const app = express();
app.post('/upload', (req, res) => {
// 在此处处理上传文件
});
app.listen(8080, () => {
console.log('Server is running at http://localhost:8080');
});
二、解析上传文件
Node.js有许多用于解析上传文件的模块,例如formidable、multer等,我们以formidable模块为例,介绍如何解析上传文件。
2.1. 使用formidable解析上传文件
使用formidable解析上传文件的代码如下:
const http = require('http');
const formidable = require('formidable');
http.createServer((req, res) => {
if (req.url === '/upload' && req.method.toLowerCase() === 'post') {
const form = new formidable.IncomingForm();
form.parse(req, (err, fields, files) => {
if (err) {
// 处理解析出错的情况
res.writeHead(500, {'Content-Type': 'text/plain'});
res.end(err.toString());
return;
}
// files中保存了上传的文件信息,可以在这里处理它们
console.log(files);
// 响应上传结果到客户端
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Upload success!');
});
}
}).listen(8080, () => {
console.log('Server is running at http://localhost:8080');
});
三、存储、检查、处理上传文件
上传的文件需要进行存储、检查、处理,存储到本地磁盘或者云端存储,检查文件大小、类型、安全性等,对文件进行提取、转换、压缩等处理。
这里我们以存储文件到本地磁盘为例,介绍如何存储上传文件。
3.1. 存储上传文件到本地磁盘
存储上传文件到本地磁盘的代码如下:
const http = require('http');
const formidable = require('formidable');
const fs = require('fs');
http.createServer((req, res) => {
if (req.url === '/upload' && req.method.toLowerCase() === 'post') {
const form = new formidable.IncomingForm();
form.parse(req, (err, fields, files) => {
if (err) {
// 处理解析出错的情况
res.writeHead(500, {'Content-Type': 'text/plain'});
res.end(err.toString());
return;
}
// 将文件存储到upload目录下
fs.rename(files.file.path, './upload/' + files.file.name, (err) => {
if (err) {
// 处理存储出错的情况
res.writeHead(500, {'Content-Type': 'text/plain'});
res.end(err.toString());
return;
}
// 响应上传结果到客户端
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Upload success!');
});
});
}
}).listen(8080, () => {
console.log('Server is running at http://localhost:8080');
});
四、响应上传结果
对上传文件完成存储、检查、处理后,需要向客户端返回上传结果。
4.1. 响应上传结果到客户端
响应上传结果到客户端的代码如下:
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Upload success!');
五、示例说明
下面提供两个示例说明。
5.1. 示例1:上传图片到本地磁盘
该示例使用express框架和multer模块,上传图片到本地磁盘。
const express = require('express');
const multer = require('multer');
const app = express();
const upload = multer({ dest: 'upload/' });
app.post('/upload', upload.single('file'), (req, res) => {
// 将文件重命名为原始名称,并存储到upload目录下
fs.rename(req.file.path, './upload/' + req.file.originalname, (err) => {
if (err) {
// 处理存储出错的情况
res.status(500).send(err.toString());
return;
}
// 响应上传结果到客户端
res.status(200).send('Upload success!');
});
});
app.listen(8080, () => {
console.log('Server is running at http://localhost:8080');
});
5.2. 示例2:上传视频到云端存储
该示例使用http模块和formidable模块,上传视频到云端存储。
const http = require('http');
const formidable = require('formidable');
const fs = require('fs');
const request = require('request');
http.createServer((req, res) => {
if (req.url === '/upload' && req.method.toLowerCase() === 'post') {
const form = new formidable.IncomingForm();
form.parse(req, (err, fields, files) => {
if (err) {
// 处理解析出错的情况
res.writeHead(500, {'Content-Type': 'text/plain'});
res.end(err.toString());
return;
}
// 将文件上传到云端存储
const fileStream = fs.createReadStream(files.file.path);
fileStream.pipe(request.post('https://example.com/api/upload', (err, response, body) => {
if (err) {
// 处理上传出错的情况
res.writeHead(500, {'Content-Type': 'text/plain'});
res.end(err.toString());
return;
}
// 响应上传结果到客户端
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(body);
}));
});
}
}).listen(8080, () => {
console.log('Server is running at http://localhost:8080');
});
以上就是实现Node.js上传功能的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:简单实现nodejs上传功能 - Python技术站