Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
浅析Node中http模块怎么处理文件上传_创想鸟

浅析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 来存储请求发来的数据:

文心大模型 文心大模型

百度飞桨-文心大模型 ERNIE 3.0 文本理解与创作

文心大模型 56 查看详情 文心大模型

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/pngrnrnrn----------------------------158329774739626517859573--rn 中间这段。我们可以去获取图片数据的起(imgDataStartIndex)止(imgDataEndIndex)位置的 index,然后使用 substring() 做个截取,最后再使用 trim() 方法去除首位的空格 rn

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模块怎么处理文件上传的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
linux怎么修改网卡名称为eth0
上一篇 2025年11月9日 16:07:17
2023年商业领袖需要关注的十大IT观察
下一篇 2025年11月9日 16:07:19

相关推荐

  • 使用本地HTML文件运行JavaScript脚本失败的原因及解决方案

    本文旨在帮助开发者理解在没有Web服务器的情况下,直接通过浏览器打开本地HTML文件时,JavaScript脚本可能无法正常运行的原因,并提供相应的解决方案。文章将深入探讨浏览器安全策略、相对路径问题以及如何正确引入和执行JavaScript脚本,确保你的HTML、CSS和JavaScript代码能…

    2026年9月21日
    000
  • PHPComposer怎么安装_PHPComposer依赖管理工具安装与使用指南

    PHPComposer是PHP的依赖管理工具,类似npm或pip。需先安装PHP,再下载并验证composer-setup.php,执行安装生成composer.phar,推荐全局安装至/usr/local/bin/composer,运行composer –version验证。使用com…

    2026年9月21日
    000
  • Java OOP如何使用内部类提高代码组织性

    内部类提升Java代码组织性与封装性,成员内部类增强封装,静态内部类分离逻辑,局部与匿名内部类简化回调,私有内部类隐藏实现细节。 内部类在Java面向对象编程中是一种有效提升代码组织性和封装性的工具。通过将一个类定义在另一个类的内部,可以更好地表达类之间的逻辑关系,控制访问权限,并减少命名冲突。合理…

    2026年9月21日
    100
  • 怎样配置VSCode与Jest、Cypress等测试框架进行集成测试?

    首先安装Jest和Cypress插件及依赖,配置jest.config.js和.vscode/settings.json实现Jest自动运行,再通过launch.json添加Cypress调试配置,最后在package.json中定义统一脚本命令,使两者在VSCode中高效协同工作。 要在 VSCo…

    2026年9月21日
    000
  • JSF应用中Markdown文档动态链接处理指南

    本教程旨在解决jsf web应用程序中集成markdown文档时,如何动态处理内部链接以实现页面局部更新的问题。通过结合服务器端markdown渲染和客户端javascript事件监听,我们可以拦截markdown生成的html链接点击事件,利用ajax异步加载并渲染目标markdown文件,从而在…

    2026年9月21日
    600
  • VSCode的自动保存与文件监听功能如何结合以避免不必要的构建触发?

    通过配置VSCode自动保存延迟和构建工具防抖,减少频繁触发构建。设置”files.autoSave”: “afterDelay”与”files.autoSaveDelay”: 3000,结合Vite或Webpack的watch…

    2026年9月21日
    000
  • Linux怎么监控特定进程的运行状态

    Linux怎么监控特定进程的运行状态Linux怎么监控特定进程的运行状态Linux怎么监控特定进程的运行状态Linux怎么监控特定进程的运行状态

    监控Linux进程需综合使用ps、top、htop、pgrep和systemctl等工具,结合资源占用、进程状态、日志输出和进程数量判断是否异常,并通过systemd的Restart机制或看门狗脚本实现自动重启,同时利用journalctl、sar、atop及Prometheus+Grafana等方…

    2026年9月21日 用户投稿
    100
  • Linux如何创建符号链接和硬链接

    Linux如何创建符号链接和硬链接Linux如何创建符号链接和硬链接Linux如何创建符号链接和硬链接Linux如何创建符号链接和硬链接

    符号链接是快捷方式,指向文件或目录路径,原文件删除后链接失效;2. 硬链接共享同一inode,不能跨文件系统或链接目录;3. 使用ln -s创建符号链接,ln创建硬链接;4. 符号链接可跨分区,硬链接删除原文件后仍可访问数据。 在Linux中,创建符号链接(软链接)和硬链接是管理文件和目录的常用操作…

    2026年9月21日 用户投稿
    100
  • 从 API 响应中提取元素并在 Java 中使用

    本文介绍了如何在 Java 中解析 API 响应,并从中提取特定元素的值。以 JSON 格式的响应为例,演示了如何使用 Jackson 库将 JSON 字符串转换为 Java 对象,并提取所需的数据,例如账户 ID,以便在后续操作中使用。 在 Java 开发中,经常需要与 API 进行交互,并从 A…

    2026年9月21日
    100
  • 如何调整VSCode的设置以获得最佳性能?

    合理配置VSCode可显著提升性能。1. 禁用不必要扩展,减少后台资源占用;2. 在settings.json中设置files.watcherExclude和search.exclude以降低CPU负载;3. 启用editor.renderLineHighlight和largeFileOptimiz…

    2026年9月20日
    500
  • VSCode的扩展推荐是怎么工作的?

    VSCode的扩展推荐基于用户行为和项目环境智能生成,当你打开.py文件时会推荐Python相关工具,打开.ts、.vue等文件则触发对应语言插件;系统通过分析package.json、requirements.txt等依赖文件识别技术栈,推荐Docker、ESLint等匹配扩展;同时记录常用操作如…

    2026年9月20日
    000
  • Linux怎么查看进程使用的端口号

    答案是使用netstat、ss或lsof命令可查看Linux进程占用的端口。首先推荐ss命令,如ss -tulnp | grep 8080,能快速显示监听端口及对应进程;其次netstat -tulnp | grep 8080用法类似,但速度较慢;lsof -i :8080可精确查看指定端口的进程信…

    2026年9月20日
    100
  • 当VSCode启动或运行变慢时,有哪些系统性的排查和优化步骤?

    答案:VSCode变慢主要由扩展、文件监控和设置引起。先以安全模式启动排查扩展影响,使用内置性能工具分析启动耗时,优化工作区的文件监听与搜索范围,调整渲染设置并清理缓存,可显著提升运行效率。 VSCode 启动或运行变慢通常涉及扩展、设置、系统资源或文件索引等问题。以下是系统性的排查与优化步骤,帮助…

    2026年9月20日
    000
  • Linux如何解决rpm依赖关系错误

    Linux如何解决rpm依赖关系错误Linux如何解决rpm依赖关系错误Linux如何解决rpm依赖关系错误Linux如何解决rpm依赖关系错误

    使用YUM可自动解决RPM依赖,通过yum localinstall安装本地包或yum install自动处理依赖;2. 较新系统推荐使用DNF,命令为dnf install 包名.rpm,依赖解析更高效;3. 无法使用YUM/DNF时可手动处理,通过rpm -ivh查看缺失依赖,再下载并按序安装;…

    2026年9月20日 用户投稿
    000
  • VSCode的侧边栏图标代表什么?

    资源管理器(文件夹图标)用于管理项目文件结构,支持新建、重命名、删除和拖拽操作;2. 搜索(放大镜图标)实现全局文本查找与替换,支持正则表达式及范围筛选;3. 源代码管理(分支图标)集成Git功能,可查看变更、提交代码并同步远程仓库;4. 运行和调试(虫子图标)支持断点调试、变量监控及多语言启动配置…

    2026年9月20日
    000
  • 如何为VSCode添加自定义主题?

    可通过安装扩展、手动添加JSON文件或使用Yeoman生成器创建主题。首先安装现成主题扩展并从颜色主题列表中选择应用;其次将自定义主题JSON文件放入用户themes目录后在命令面板中启用;最后可用yo code生成项目开发发布主题,需编辑配色文件并预览效果。 为 VSCode 添加自定义主题有几种…

    2026年9月20日
    000
  • edge浏览器无法打开本地HTML文件或显示空白怎么办_Edge浏览器打开本地HTML文件失败解决方法

    1、检查文件路径并选择Edge打开,确保路径为纯英文;2、在edge://flags中启用“Allow file access from files”;3、使用开发者工具排查资源加载错误;4、通过命令行启动Edge绕过安全限制;5、推荐使用npx live-server搭建本地服务器运行HTML文件…

    2026年9月20日
    000
  • mysql如何配置临时文件权限

    通过设置tmpdir指定专用目录并配置系统权限为700,结合文件系统安全挂载选项与MySQL用户权限控制,可有效保障MySQL临时文件安全性。 MySQL 本身不直接提供配置“临时文件权限”的参数,但可以通过操作系统层面和 MySQL 相关配置共同控制临时文件的创建位置与访问权限,确保安全性。关键在…

    2026年9月20日
    000
  • Linux如何给用户分配磁盘配额

    答案:Linux通过quota工具为用户设置磁盘空间和文件数量限制。首先安装quota工具,编辑/etc/fstab添加usrquota和grpquota选项,重新挂载文件系统;运行quotacheck创建配额数据库,使用quotaon启用配额;通过edquota -u设置用户配额,包括块和inod…

    2026年9月20日
    000
  • mysql如何实现用户注册功能

    答案:通过MySQL创建用户表并结合后端逻辑实现注册功能。首先在MySQL中创建包含用户名、密码、邮箱等字段的users表,确保唯一性约束;后端接收%ignore_a_1%提交的注册数据,对密码加密(如SHA256或bcrypt),使用参数化查询将数据安全存入数据库;前端通过表单或AJAX发送注册请…

    2026年9月13日
    200

发表回复

登录后才能评论
关注微信