下面是详细讲解“NodeJS使用formidable实现文件上传”的完整攻略:
什么是formidable?
formidable是NodeJS的一个表单数据处理库,包括以下功能:
- 把上传的文件保存到本地文件系统中
- 转换HTTP请求中的表单数据为可读取的对象
- 限制上传文件的大小
安装formidable
安装formidable非常简单,只要在项目目录执行以下命令即可:
npm install formidable --save
文件上传处理
- 首先,需要使用NodeJS的HTTP模块创建一个服务器,示例代码如下:
```javascript
const http = require('http');
const server = http.createServer((req, res) => {
// 在此添加文件上传处理功能
});
server.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
```
- 接下来,需要使用formidable来处理上传的文件数据,示例代码如下:
```javascript
const http = require('http');
const formidable = require('formidable');
const fs = require('fs');
const server = http.createServer((req, res) => {
if (req.url === '/upload' && req.method.toLowerCase() === 'post') {
// 创建formidable实例
const form = new formidable.IncomingForm();
// 解析上传的文件数据
form.parse(req, (err, fields, files) => {
if (err) throw err;
// 在这里处理上传的文件
const oldpath = files.file.path;
const newpath = './uploads/' + files.file.name;
fs.rename(oldpath, newpath, (err) => {
if (err) throw err;
res.write('File uploaded and moved!');
res.end();
});
});
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<form action="/upload" method="post" enctype="multipart/form-data">');
res.write('<input type="file" name="file"><br>');
res.write('<input type="submit">');
res.write('</form>');
return res.end();
}
});
server.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
```
在这个示例中,当用户访问根URL时会展示文件上传表单,用户选择文件并提交表单时,服务器将收到一个POST请求,formidable会解析上传的文件数据并保存到本地文件系统中。
示例说明
示例1:上传图片并显示
接下来介绍一个示例,该示例将上传的图片在页面上进行展示。代码如下:
const http = require('http');
const formidable = require('formidable');
const fs = require('fs');
const server = http.createServer((req, res) => {
if (req.url === '/upload' && req.method.toLowerCase() === 'post') {
// 创建formidable实例
const form = new formidable.IncomingForm();
// 解析上传的文件数据
form.parse(req, (err, fields, files) => {
if (err) throw err;
// 在这里处理上传的文件
const oldpath = files.file.path;
const newpath = './uploads/' + files.file.name;
fs.rename(oldpath, newpath, (err) => {
if (err) throw err;
res.write('File uploaded and moved!<br><br>');
res.write(`<img src="${newpath}" width="500px">`);
res.end();
});
});
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<form action="/upload" method="post" enctype="multipart/form-data">');
res.write('<input type="file" name="file"><br>');
res.write('<input type="submit">');
res.write('</form>');
return res.end();
}
});
server.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
在这个示例中,服务器将上传的图片保存到本地文件系统中,并将图片路径传递给前台,页面会加载该图片并进行展示。
示例2:限制上传文件大小
接下来介绍一个示例,该示例限制了上传文件的大小,如果上传文件大小超出限制则会返回错误信息。代码如下:
const http = require('http');
const formidable = require('formidable');
const fs = require('fs');
const server = http.createServer((req, res) => {
if (req.url === '/upload' && req.method.toLowerCase() === 'post') {
// 创建formidable实例
const form = new formidable.IncomingForm();
// 限制上传文件的大小
form.maxFileSize = 10 * 1024 * 1024; // 限制上传文件最大为10MB
// 解析上传的文件数据
form.parse(req, (err, fields, files) => {
if (err) throw err;
// 在这里处理上传的文件
const oldpath = files.file.path;
const newpath = './uploads/' + files.file.name;
fs.rename(oldpath, newpath, (err) => {
if (err) throw err;
res.write('File uploaded and moved!');
res.end();
});
});
// 监听文件大小超过限制的事件
form.on('error', (err) => {
res.write(`Error: ${err.message}`);
res.end();
});
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<form action="/upload" method="post" enctype="multipart/form-data">');
res.write('<input type="file" name="file"><br>');
res.write('<input type="submit">');
res.write('</form>');
return res.end();
}
});
server.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
在这个示例中,我们通过设置form.maxFileSize
来限制了上传文件的大小,如果上传文件超过限制,formidable会抛出错误并触发form.on('error')
事件,我们可以在事件处理函数中返回错误信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:NodeJS使用formidable实现文件上传 - Python技术站