【每日一题NO.70】Node中处理文件上传
共 1700字,需浏览 4分钟
·
2021-10-29 00:00
问题:
当我们前端调用文件上传接口的时候,Node服务中如何可以拿到上传的文件内容?
http.createServer
在不使用Node框架的情况下,我们可以使用 http
模块自带的 createServer函数[1]。
基本用法:
const http = require('http');
// 创建本地服务器来从其接收数据
const server = http.createServer((request, response) => {
console.log(request)
// 设置响应头,当同时使用了response.setHeader() 和 response.writeHead() 时,所有设置会被合并到一起,且 response.writeHead() 的设置优先。
response.writeHead(200, { 'Content-Type': 'application/json' });
// 返回一个JSON字符串,有data属性值为'Hello World!'
response.end(JSON.stringify({
data: 'Hello World!'
}));
});
server.listen(8000); // 启动服务后访问 http://localhost:8000/
传入请求对象的 request
,其实已经实现了 ReadableStream
接口,这个信息流可以被监听或者与其它流进行对接。我们可以监听 data
和 end
事件从而把数据给取出来。
获取到上传文件的内容代码如下:
const http = require('http');
let fileData = '';
http.createServer((request, response) => {
request
.on('error', (err) => {
console.error(err);
})
.on('data', (chunk) => {
// 在data中拼接分段的流数据
fileData += data;
})
.on('end', () => {
// end事件回调时说明拼接结束,拿到完整数据。
console.log('得到最终文件结果:', fileData);
});
}).listen(8080);
文件流
文件的内容不是一次性的传过来,是以 流[2] 的方式传输的。
流数据是一组顺序、大量、快速、连续到达的数据序列,可理解为一个动态数据集合。
意象理解:一个文件就像一块冰,我们要进行服务器之间网络传输时,需要讲冰化成水,一点点倒给网络水槽,从A杯子通过水管流到B杯子,水流汇集完毕后再存储成一块冰。
Content-Type
注意文件上传时,请求头里的 Content-Type字段[3] 对应的值应该是multiparty/form-data; boundary=something
。
参考资料
[1]createServer函数: http://nodejs.cn/api/http.html#http_http_createserver_options_requestlistener
[2]流数据·百度百科: https://baike.baidu.com/item/%E6%B5%81%E6%95%B0%E6%8D%AE/7418273?fr=aladdin
[3]Content-Type字段: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Type
所有《每日一题》的 知识大纲索引脑图 整理在此:https://www.yuque.com/dfe_evernote/interview/everyday
你也可以点击文末的 “阅读原文” 快速跳转
END愿你历尽千帆,归来仍是少年。