首页 文章详情

【每日一题NO.70】Node中处理文件上传

前端印记 | 284 2021-10-29 00:00 0 0 0
UniSMS (合一短信)

229c43a057edf6a74c08c6f4d246cd4b.webp

3babbdd401b41fc690620ecb66921174.webp


问题:

当我们前端调用文件上传接口的时候,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 接口,这个信息流可以被监听或者与其它流进行对接。我们可以监听 dataend 事件从而把数据给取出来。

获取到上传文件的内容代码如下:

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
你也可以点击文末的 “阅读原文” 快速跳转

91bbf803f937b128201ccf311d16eabf.webp
END愿你历尽千帆,归来仍是少年。


good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter