广告
返回顶部
首页 > 资讯 > 前端开发 > html >nodejs怎么实现http传输大文件
  • 282
分享到

nodejs怎么实现http传输大文件

2024-04-02 19:04:59 282人浏览 安东尼
摘要

这篇文章主要介绍“nodejs怎么实现Http传输大文件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs怎么实现http传输大文件”文章能帮助大家解决问题

这篇文章主要介绍“nodejs怎么实现Http传输大文件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs怎么实现http传输大文件”文章能帮助大家解决问题。

nodejs怎么实现http传输大文件

基于nodejs的http文件传输方案在现阶段的前后端全栈开发中有都很重要的作用,本文我将通过几种方案实现http传输大文件。在实现功能之前,我们先通过nodejs的fs模块写入一个大文件,并在项目中生成一个本地文件:

const fs = require('fs');
const writeStream = fs.createWriteStream(__dirname + "/file.txt");
for(let i = 0;i <= 100000; i++) {
  writeStream.write(`${i} —— 我是${i}号文件\n`, "utf-8");
}
writeStream.end();

nodejs怎么实现http传输大文件

以上代码成功运行后,在当前的执行目录下将会生成一个大小为 3.2MB 大小的文本文件,该文件将作为以下方案的 “大文件素材”。在列出大文件传输方案之前,我们先封装后面即将用到的两个公共方法: 文件读取方法文件压缩方法

// 封装读取文件的方法
const readFile = async (paramsData) => {
  return new Promise((resolve, reject) => {
    fs.readFile(paramsData, (err, data) => {
      if(err) {
        reject('文件读取错误');
      } else {
        resolve(data);
      }
    })
  })
}

// 封装文件压缩方法
const gzip = async (paramsData) => {
  return new Promise((resolve, reject) => {
    zlib.gzip(paramsData, (err, result) => {
      if(err) {
        reject('文件压缩错误');
      } else {
        resolve(result);
      }
    })
  })
}

1. 通过大文件在数据压缩后传输

浏览器在发送请求时,都会携带 acceptaccept-* 请求头信息,用于告诉服务器当前浏览器所支持的文件类型、支持的压缩格式列表和支持的语言。请求头中的 Accept-Encoding 字段,用于将客户端能够理解的内容编码方式(通常是某种压缩算法)告诉给服务端。服务端会选择一个客户端所支持的方式,并通过响应头 Content-Encoding 来通知客户端该选择,响应头告诉浏览器返回的 JS 脚本,是经过 gzip 压缩算法处理过的

// 请求头
accept-encoding: gzip, deflate, br
// 响应头
cache-control: max-age=2592000 
content-encoding: gzip 
content-type: application/x-javascript

基于 Accept-EncodingContent-Encoding 字段的了解,我们来验证一下未开启 gzip 和开启 gzip 的效果。

// 实现一个简单的文件读取服务器(没有开启gzip)
const server = http.createServer(async (req, res) => {
  res.writeHead(200, {
    "Content-Type": "text/plain;charset=utf-8",
  });
  const buffer = await readFile(__dirname + '/file.txt');
  res.write(buffer);
  res.end();
})
server.listen(3000, () => {
  console.log(`server启动成功`)
})

nodejs怎么实现http传输大文件

// 实现一个简单的文件读取服务器(开启gzip)
const server = http.createServer(async(req, res) => {
  res.writeHead(200, {
    "Content-Type": "text/plain;charset=utf-8",
    "Content-Encoding": "gzip"
  });
  const buffer = await readFile(__dirname + '/file.txt');
  const gzipData = await gzip(buffer);
  res.write(gzipData);
  res.end();
})
server.listen(3000, () => {
  console.log(`server启动成功`)
})

nodejs怎么实现http传输大文件

2. 通过数据分块传输

有场景需要用从数据库中查询获得的数据生成一个大的 html 表格的时候,或者需要传输大量的图片的时候,可以通过分块传输实现。

Transfer-Encoding: chunked
Transfer-Encoding: gzip, chunked

响应头 Transfer-Encoding 字段的值为 chunked,表示数据以一系列分块的形式进行发送。需要注意的是 Transfer-EncodingContent-Length 这两个字段是互斥的,也就是说响应报文中这两个字段不能同时出现。

// 数据分块传输
const spilitChunks = async () =>{
  const buffer = await readFile(__dirname + '/file.txt');
  const lines = buffer.toString('utf-8').split('\n');
  let [chunks, i, n] = [[], 0, lines.length];
  while(i < n) {
    chunks.push(lines.slice(i, i+= 10));
  };
  return chunks;
}
const server = http.createServer(async(req, res) => {
  res.writeHead(200, {
    "Content-Type": "text/plain;charset=utf-8",
    "Transfer-Encoding": "chunked",
    "Access-Control-Allow-Origin": "*",
  });
  const chunks = await spilitChunks();
  for(let i =0; i< chunks.length; i++) {
    setTimeout(() => {
      let content = chunks[i].join("&");
      res.write(`${content.length.toString(16)}\r\n${content}\r\n`);
    }, i * 1000);
  }
  setTimeout(() => {
    res.end();
  }, chunks.length * 1000);
})
server.listen(3000, () => {
  console.log(`server启动成功`)
})

3. 通过数据流的形式传输

当使用 node.js 向客户端返回大文件时,使用流的形式来返回文件流能避免处理大文件时,占用过多的内存。具体实现方式如下所示。当使用流的形式来返回文件数据时,HTTP 响应头 Transfer-Encoding 字段的值为 chunked,表示数据以一系列分块的形式进行发送。

const server = http.createServer((req, res) => {
  res.writeHead(200, {
    "Content-Type": "text/plain;charset=utf-8",
    "Content-Encoding": "gzip",
    "Transfer-Encoding": "chunked"
  });
  fs.createReadStream(__dirname + "/file.txt")
    .setEncoding("utf-8")
    .pipe(zlib.createGzip())
    .pipe(res);
})

server.listen(3000, () => {
  console.log(`server启动成功`)
})

关于“nodejs怎么实现http传输大文件”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网html频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: nodejs怎么实现http传输大文件

本文链接: https://www.lsjlt.com/news/88301.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • nodejs怎么实现http传输大文件
    这篇文章主要介绍“nodejs怎么实现http传输大文件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs怎么实现http传输大文件”文章能帮助大家解决问题...
    99+
    2022-10-19
  • 怎么用Vue+NodeJS实现大文件上传
    本文小编为大家详细介绍“怎么用Vue+NodeJS实现大文件上传”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用Vue+NodeJS实现大文件上传”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。常见的文件上传...
    99+
    2023-06-30
  • golang怎么实现大文件传输功能
    在Go语言中,可以使用`io.Copy()`函数来实现大文件传输功能。`io.Copy()`函数会从源文件(例如,一个`io.Rea...
    99+
    2023-10-27
    golang
  • golang如何实现大文件传输
    在 Golang 中,可以使用 io 和 os 包来实现大文件的传输。以下是一种可能的实现方式: 首先,需要创建一个服务器端和一个客...
    99+
    2023-10-21
    golang
  • linux中怎么实现文件传输
    这期内容当中小编将会给大家带来有关linux中怎么实现文件传输,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。linux的scp命令 linux 的 scp 命令 可以 在 linux 之间复制 文件 和 ...
    99+
    2023-06-13
  • Vue+NodeJS实现大文件上传的示例代码
    目录整体思路项目演示前端界面文件切片hash计算查询切片状态切片上传(断点续传)文件总体上传进度合并文件优化请求并发数控制hash值计算优化常见的文件上传方式可能就是new一个For...
    99+
    2022-11-13
  • 怎么使用java socket传输大文件
    要使用Java Socket传输大文件,可以使用以下步骤:1. 创建一个ServerSocket对象来监听某个端口号,等待客户端连接...
    99+
    2023-09-23
    java
  • 两个电脑怎么传输大文件
    有多种方法可以传输大文件,以下是其中几种常见的方法:1. 使用USB存储设备:将大文件保存在一个USB闪存盘或移动硬盘中,然后将其插...
    99+
    2023-09-08
    电脑
  • golang实现大文件传输的方法是什么
    在Golang中实现大文件传输可以使用以下方法之一:1. 使用基于TCP的传输:可以使用net或net/http包来实现基于TCP的...
    99+
    2023-10-20
    golang
  • java离线文件传输怎么实现
    要实现Java的离线文件传输,可以使用Socket编程来实现。下面是一个简单的离线文件传输的示例代码:服务端代码:```javaim...
    99+
    2023-09-23
    java
  • NetCat怎么实现远程文件传输
    这篇文章主要介绍“NetCat怎么实现远程文件传输”,在日常操作中,相信很多人在NetCat怎么实现远程文件传输问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”NetCat怎么实现远程文件传输”的疑惑有所帮助!...
    99+
    2023-06-29
  • golang大文件上传怎么实现
    在Go语言中,可以使用`net/http`包来实现大文件上传。下面是一个简单的示例: package main import ( ...
    99+
    2023-10-26
    golang
  • 如何使用HTTP实现文本传输
    如何使用HTTP实现文本传输,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网...
    99+
    2023-06-05
  • Node.js+express怎么实现上传大文件
    这篇“Node.js+express怎么实现上传大文件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Node.js+expr...
    99+
    2023-06-17
  • NodeJS使用formidable实现文件上传
    最近自学了一下NodeJS,然后做了一个小demo,实现歌曲的添加、修改、播放和删除的功能,其中自然要实现音乐和图片的上传功能。于是上网查找资料,找到了一个formidable插件,该插件可以很好的实现文件...
    99+
    2022-06-04
    文件上传 NodeJS formidable
  • Nodejs中怎么利用express和multer实现文件上传
    这期内容当中小编将会给大家带来有关Nodejs中怎么利用express和multer实现文件上传,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。非常简单,一行命令。npm&...
    99+
    2022-10-19
  • 怎么使用Reactjs+Nodejs+Mongodb实现文件上传功能
    本文小编为大家详细介绍“怎么使用Reactjs+Nodejs+Mongodb实现文件上传功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Reactjs+Nodejs+Mongodb实现文件上传功能”文章能帮助大家解决疑惑,下面跟...
    99+
    2023-07-02
  • Node.js怎么实现上传大文件功能
    本篇内容主要讲解“Node.js怎么实现上传大文件功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js怎么实现上传大文件功能”吧!对于大文件的上传我们首先要引入一个叫做 multer...
    99+
    2023-07-04
  • Node.js和express怎么实现上传大文件
    这篇“Node.js和express怎么实现上传大文件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Node.js和expr...
    99+
    2023-07-04
  • nodejs怎么获取文件大小
    在Node.js中,可以使用`fs`模块的`stat`方法来获取文件的大小。`stat`方法返回一个包含文件信息的对象,其中包括`s...
    99+
    2023-08-15
    nodejs
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作