浅析Node中http模块怎么处理文件上传

怎么使用node.js的http模块处理文件上传?下面本篇文章就来看看在服务器端要如何处理前端上传的文件,希望对大家有所帮助!

浅析Node中http模块怎么处理文件上传

查看请求数据

如果我们现在向服务器发送的数据如下图所示,里面包含了普通的字段信息 name 以及一个图片文件 file:

1.png

我们先来看看如何在服务器接收到文件上传的数据,并在调试控制台打印查看:

const http = require('http')const server = http.createServer((req, res) => {  req.setEncoding('binary')  req.on('data', data => {    console.log(data)  })  req.on('end', () => {    console.log('上传结束')    res.end('上传成功')  })})server.listen(3010, () => console.log('服务器开启'))

登录后复制

想要能看懂打印的结果,我们通过 req.setEncoding(‘binary’) 设置了字符编码为 ‘binary’,这样得到的数据就不是 buffer 对象而是 ASCII 编码后的字符串,我们就可以使用一些字符串的方法来处理数据了。

但是当文件大小比较大时,直接通过在命令行输入 node 或 nodemon 来运行代码,得到的数据无法完全在控制台展示。所以我们可以在要打印请求数据的地方打上断点,通过 debugger 的模式来运行代码:

2.png

点击 “运行和调试” 后,vs code 就会帮我们把服务器运行起来了:

3.png

之后当我们发送了上传的请求,再点击下图右上角的 “单步跳过”,就可以看到请求的数据了 —— 那些可以被 ASCII 编译的信息,比如英文字母,可以直接看到了,而图片的数据则是一堆乱码:

4.png

接下来就是处理获取的请求数据,将里面的图片数据截取出来然后通过写入流生成图片。

处理文件(图片)数据

获取图片数据

因为可读流的 ‘data’ 事件一次最多读取 64kb 的数据,当图片比较大时,可能会触发多次,所以我们定义变量 reqData 来存储请求发来的数据:

let reqData = ''req.on('data', data => {  reqData += data})req.on('end', () => {  console.log(reqData) // 在这行打断点  res.end('上传成功')})

登录后复制

当 req 触发了 ‘end’ 事件说明请求数据读取完毕,如果在上列代码的第 6 行 console.log(reqData) 处打个断点,然后查看 reqData,得到的数据如下:

5.png

图片的数据应该是 image/png 与 —————————-158329774739626517859573– 中间这段。我们可以去获取图片数据的起(imgDataStartIndex)止(imgDataEndIndex)位置的 index,然后使用 substring() 做个截取,最后再使用 trim() 方法去除首位的空格 :

const imgType = 'image/png'const imgDataStartIndex = reqData.indexOf(imgType) + imgType.lengthconst imgDataEndIndex = reqData.indexOf(`--${boundary}--`)const imgData = reqData.substring(imgDataStartIndex, imgDataEndIndex).trim()

登录后复制

获取分隔符 boundary

————————–158329774739626517859573是客户端随机生成的,用于分割表单里的每段数据的分隔符(boundary),在每个表单项的开头和结尾都有,并且在开头处的前面都会加上两个减号 –,在整个表单数据结束处的末尾也会加上两个减号。查看请求头:

6.png

可以发现在 content-type 里定义了boundary,于是我们可以使用如下方法获取分隔符:

const boundary = req.headers['content-type'].split('boundary=')[1]

登录后复制

生成图片

获取到了图片数据 imgData 后,就可以通过 fs 的 writeFile() 写入文件生成图片了:

fs.writeFile('./img.png', imgData, 'binary', err => {  if (!err) console.log('图片写入成功')})

登录后复制

注意需要在第三个参数传入’binary’ 来设定 encoding 。

总结

现将代码汇总如下:

const http = require('http')const fs = require('fs')const server = http.createServer((req, res) => {  req.setEncoding('binary')  const boundary = req.headers['content-type'].split('boundary=')[1]  let reqData = ''  req.on('data', data => {    reqData += data  })  req.on('end', () => {    const imgType = 'image/png'    const imgDataStartIndex = reqData.indexOf(imgType) + imgType.length    const imgDataEndIndex = reqData.indexOf(`--${boundary}--`)    const imgData = reqData.substring(imgDataStartIndex, imgDataEndIndex).trim()    fs.writeFile('./img.png', imgData, 'binary', err => {      if (!err) console.log('图片写入成功')    })    res.end('上传成功')  })})server.listen(3010, () => console.log('服务器开启'))

登录后复制

上述代码能够成功运行还有一些限制,比如只能处理单文件上传,且文件需要是 png 格式的图片,并且放在表单最后一项。文章的目的在于简单了解使用 node 的 http 模块搭建的服务器大体上是如何处理上传文件的请求的,为将来深入学习其它基于 http 模块的框架(express.js、koa.js 等)打好基础。

更多node相关知识,请访问:nodejs 教程!

以上就是浅析Node中http模块怎么处理文件上传的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2631392.html

(0)
上一篇 2025年3月7日 03:59:28
下一篇 2025年2月27日 17:55:33

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 浅析node中怎么使用import语法

    node.js支持import语法,很简单一个知识点,但是却能提醒我们从知识误区里走出来,多关注外边的知识世界,不断打开自己的知识边界。 js模块化 前端主流模块化规范,目前有以下几种: CommonJS, Node.js提出的规范ECMA…

    2025年3月7日
    200
  • 深入浅析Node的进程管理工具“pm2”

    本篇文章给大家分享node的进程管理工具“pm2”,聊聊为什么需要pm2、安装和使用pm2的方法,希望对大家有所帮助! PM2简介 PM2是一个内建了负载均衡器的node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监…

    2025年3月7日 编程技术
    200
  • 手把手教你使用Node连接mongodb

    要使用 Node.js 连接 MongoDB,通常使用 Mongoose 这个对象文档模型(ODM)库。下面就来简单介绍一下使用 Mongoose 连接 MongoDB 的方法。 Mongoose 是一个 Node.js 包,提供了一个使用…

    2025年3月7日
    200
  • 带你深入了解HTTP模块

    本篇文章带大家学习http模块相关内容,为写接口做基础,希望对大家有所帮助! 一、Web服务器 什么是web服务器? 当应用程序(客户端)需要某一个资源时,可以向一个台服务器,通过Http请求获取到这个资源;提供资源 的这个服务器,就是一个…

    2025年3月7日 编程技术
    200
  • node和laravel项目中预渲染vue.js应用程序

    服务器端渲染现在非常流行。但它也并非没有缺点。预渲染是一种替代方法,在某些情况下甚至可能更好。下面我们来看一下如何预渲染vue.js应用程序。 在本文中,我们将探讨预渲染如何与vue.js一起工作,并看两个示例:一个是node.js项目,一…

    2025年3月6日
    200
  • 基于Node.js的JavaScript项目构建工具gulp的使用方法

    这篇文章主要介绍了关于基于node.js的javascript项目构建工具gulp的使用方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 也许你使用过grunt,那么这里来安利gulp的话就更加不会陌生了,下面我们就来看一…

    2025年3月6日
    200
  • vue.js就是node吗

    vue.js不是node;两者是完全不同的。vue.js是一款JavaScript前端框架,一个用于创建用户界面的开源JS框架;而Node是一个基于Chrome V8引擎的JavaScript运行环境,一个让JS运行在服务端的开发平台。 本…

    2025年3月6日
    200
  • 卸载node的命令

    卸载node的命令是“remove”和“rm -rf”,其具体卸载node的方法是:首先使用“sudo apt-get remove nodejs npm”命令删除一次node;然后通过“rm -rf”命令删除文件即可。 本文操作环境:wi…

    2025年3月6日
    200
  • node是啥

    node有三种意思:1、指网络结点,主要负责网络中信息的发送接收和转发;2、指XML文档中的节点,文档树中不同类型的节点由特定的Node子接口表示;3、指Node.js,一个基于Chrome V8引擎的js运行环境。 本文操作环境:Wind…

    2025年3月6日
    200
  • node、nvm与npm有什么区别

    node、nvm与npm的区别:1、nodejs是项目开发时所需要的代码库,nvm是nodejs版本管理工具,npm是nodejs包管理工具;2、nodejs能够使得javascript能够脱离浏览器运行,nvm能够管理nodejs和npm…

    2025年3月6日
    200

发表回复

登录后才能评论