Node.js提供了http
模块作为内置的HTTP服务器,在其中可以实现文件上传和图片上传的功能。以下是完整攻略:
文件上传
前置条件
在实现文件上传之前,需要安装formidable
模块。可以通过运行以下命令安装:
npm install formidable
代码示例
const http = require('http');
const fs = require('fs');
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('Internal Server Error');
return;
}
const oldPath = files.file.path;
const newPath = `${__dirname}/uploaded_files/${files.file.name}`;
fs.rename(oldPath, newPath, (err) => {
if (err) {
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end('Internal Server Error');
return;
}
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('File uploaded successfully');
});
});
} else {
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('Not found');
}
}).listen(3000);
代码说明
- 首先,我们创建了一个HTTP服务器,监听在端口3000并处理请求:
javascript
http.createServer((req, res) => {
// 处理请求
}).listen(3000);
- 使用
formidable
模块处理文件上传后的POST请求:
javascript
if (req.url === '/upload' && req.method.toLowerCase() === 'post') {
const form = new formidable.IncomingForm();
form.parse(req, (err, fields, files) => {
// 处理文件上传
});
}
注意,这里的/upload
是上传的接口地址,需要和html文件中的form action属性或其他POST请求中的URL保持一致。
- 把上传的文件保存在服务器中:
javascript
const oldPath = files.file.path;
const newPath = `${__dirname}/uploaded_files/${files.file.name}`;
fs.rename(oldPath, newPath, (err) => {
// 处理保存操作
});
__dirname
是全局变量,表示当前脚本文件所在的目录,${__dirname}/uploaded_files
表示上传的文件需要保存到该目录下。fs.rename
方法将上传的文件从原有的临时路径移动到指定路径uploaded_files
中。
- 返回处理结果:
javascript
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('File uploaded successfully');
HTTP标准中规定了状态码和响应头,这里返回了状态码200(OK)和响应头Content-Type: text/plain
,具体返回的内容是File uploaded successfully
。
图片上传
前置条件
在实现图片上传之前,同样需要安装formidable
模块。除此之外,还需要在html代码中添加一个form表单,指定enctype属性为multipart/form-data
。
代码示例
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>图片上传页面</title>
</head>
<body>
<h2>上传图片</h2>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="image">
<br>
<input type="submit" value="上传">
</form>
</body>
</html>
const http = require('http');
const fs = require('fs');
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('Internal Server Error');
return;
}
const oldPath = files.image.path;
const newPath = `${__dirname}/uploaded_images/${files.image.name}`;
fs.rename(oldPath, newPath, (err) => {
if (err) {
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end('Internal Server Error');
return;
}
res.writeHead(200, { 'Content-Type': 'text/html' });
res.write(`<img src="uploaded_images/${files.image.name}" width="400" />`);
res.end();
});
});
} else {
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('Not found');
}
}).listen(3000);
代码说明
- 在html中添加form表单,并指定enctype为
multipart/form-data
:
```html
```
注意,这里的action
属性值需要和Node.js中实现的上传接口地址保持一致。
- 在服务器中获取上传的图片并保存:
javascript
const oldPath = files.image.path;
const newPath = `${__dirname}/uploaded_images/${files.image.name}`;
fs.rename(oldPath, newPath, (err) => {
// 处理保存操作
});
注意,这里的image
是html中input
的name
,需要和上传接口中的参数名保持一致。
- 返回处理结果:
javascript
res.writeHead(200, { 'Content-Type': 'text/html' });
res.write(`<img src="uploaded_images/${files.image.name}" width="400" />`);
res.end();
返回的是一个img
标签,显示刚上传的图片,src
指向刚才保存的图片地址,可以根据实际情况修改路径。
这两个示例均可以通过post方式发送数据,Node.js服务器接收到数据后,通过formidable模块解析收到的数据,获取数据内容并进行相应的处理,实现了上传的功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.js HTTP服务器中的文件、图片上传的方法 - Python技术站