Node.js实现兼容IE789的文件上传进度条

下面我将详细讲解实现“Node.js实现兼容IE789的文件上传进度条”的完整攻略,过程中将会包含两条示例说明:

简述

在传统的方式下,采用form表单上传文件时,前端无法获得上传文件具体传输进度,需要后端记录文件上传状态并实时传输给前端,因此本文将介绍如何使用Node.js实现兼容IE789的文件上传进度条。

步骤

1. 安装依赖库

使用nodejs的开发者们可以使用官方模块formidable对表单数据进行解码,并支持自动处理文件上传进度。

按照如下命令来安装formidable

npm install formidable

2. 使用formidable处理文件上传请求

首先我们需要创建一个处理文件上传请求的upload函数,在中间件next中触发,该函数用req对象的on方法来处理文件中的文件数据。

const formidable = require("formidable")

function upload(req, res, next) {
  const form = formidable({ multiples: true })
  form.parse(req, (err, fields, files) => {
    if (err) {
      next(err)
      return
    }

    // do something with files

    next()
  })

  form.on("progress", (bytesReceived, bytesExpected) => {
    const percent = Math.floor(bytesReceived / bytesExpected * 100)
    console.log(`[${new Date().toLocaleTimeString()}]上传进度:${percent}%`)
  })
}

在上面的代码中,我们首先引入了formidable模块,然后定义了一个upload函数用于处理表单数据,其内部使用了formidable模块的parse方法解析表单数据,其中next是用来控制中间件流程的。同时,我们注册了一个progress事件实现文件上传进度的记录与展示。

3. 设置前端页面

为使网页上传文件引发upload function,必须要使用html5 FormData上传方式。我们定义一个HTML表单和JavaScript代码分别实现这个:

<form action="/upload" method="POST" enctype="multipart/form-data">
  <input type="file" name="file">
  <input type="submit" value="Upload">
</form>
const form = document.querySelector("form")
form.addEventListener("submit", (e) => {
  e.preventDefault()

  const formData = new FormData(form)
  const xhr = new XMLHttpRequest()

  xhr.open("POST", "/upload")
  xhr.upload.onprogress = (event) => {
    if (event.lengthComputable) {
      const percent = Math.floor(event.loaded / event.total * 100)
      console.log(`[${new Date().toLocaleTimeString()}] 上传进度:${percent}%`)
    }
  }

  xhr.send(formData)
})

在上述 JavaScript 代码中,我们创建了一个FormData 对象,并使用XMLHttpRequest 对象向Node.js服务器发送数据。

4. 运行服务器

最后我们启动服务器和上传文件的基本路由:

const express = require("express")
const app = express()

app.use(express.static(__dirname + "/public"))

app.post("/upload", upload, (req, res) => {
  res.send(200)
})

app.listen(3000, () => {
  console.log(`Server listening on port ${3000}`)
})

在上面的代码中,我们定义了Express 应用程序,使用express.static()访问静态资源,定义了一个简单的上传路由 /upload,处理网络请求时,先执行 upload 函数,然后使用res.send()返回一个可选状态码。

示例一

假如你已经有一个使用express框架的nodejs服务端,你只需要根据上述步骤实现文件上传进度条的功能。示例代码可参照上述伪码实现。

示例二

如果你希望了解如何使用Node.js从前端页面上传文件及文件传输进度,可以尝试创建一个Express服务器来实现以下示例。

首先,创建一个项目并初始化:

mkdir express-upload-progress-bar
cd express-upload-progress-bar
npm init -y

第二步:安装依赖

npm install express formidable morgan

然后,在项目根目录创建 app.js 文件

const express = require('express')
const formidable = require('formidable')

const PORT = process.env.PORT || 3000

const app = express()

app.use(express.static('public'))

const upload = (req, res, next) => {
  const form = formidable({ multiples: true })
  form.parse(req, (err, fields, files) => {
    if (err) {
      next(err)
      return
    }

    // something to do with files

    res.json({ fields, files })
  })

  form.on('progress', (bytesReceived, bytesExpected) => {
    const percent = (bytesReceived / bytesExpected * 100) | 0
    console.log(percent)
  })
}

app.post('/upload', upload)

app.listen(PORT, () =>
  console.log('express-upload-progress-bar is running on port', PORT),
)

A sample HTML page to test our server:

<!DOCTYPE html>
<html>

<head>
  <title>Image Upload</title>
</head>

<body>
  <form id="upload">
    <input type="file" multiple name="media">
    <button type="submit">Upload</button>
    <progress max="100" value="0"></progress>
  </form>
  <script>
    const progressBar = document.querySelector('progress')
    const form = document.querySelector('#upload')

    form.addEventListener('submit', (evt) => {
      evt.preventDefault()
      const xhr = new XMLHttpRequest()
      xhr.open('POST', '/upload', true)
      xhr.onload = (event) => {
        console.log(event.target.response)
      }
      xhr.upload.onprogress = (event) => {
        if (event.lengthComputable) {
          const percent = (event.loaded / event.total * 100) | 0
          console.log(percent)
          progressBar.value = percent
        }
      }
      xhr.send(new FormData(form))
    })
  </script>
</body>

</html>

这样,我们通过这个简单的HTML文件和JS代码实现了从前端页面上传文件及文件传输进度。

总结

在Node.js中实现兼容IE789的文件上传进度条,采用了formidable模块处理文件上传请求,使用XMLHttpRequest对象实现ajax通信,进而将进度数据反馈给用户。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.js实现兼容IE789的文件上传进度条 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 基于socket.io和node.js搭建即时通信系统

    下面我将为大家详细讲解搭建基于socket.io和node.js的即时通信系统的完整攻略。 前期准备 在开始搭建之前,我们需要先安装好node.js和npm。建议使用nvm管理node.js版本。 步骤1:新建工作目录 首先需要新建一个工作目录,我们可以在控制台中输入以下命令: mkdir chat-demo 进入该目录: cd chat-demo 步骤2:…

    node js 2023年6月8日
    00
  • React和Node.js快速上传进度条功能实现

    React和Node.js快速上传进度条功能实现 上传文件的进度条功能是现代Web应用程序中的常见需求。本文将介绍如何使用React和Node.js创建一个快速上传进度条。 前置条件 在学习具体的实现前,你需要掌握以下技能和知识: 掌握React基础知识和操作; 掌握Node.js和Express框架的基础知识; 掌握使用axios发送http请求; 掌握使…

    node js 2023年6月8日
    00
  • 从零学习node.js之模块规范(一)

    针对“从零学习node.js之模块规范(一)”的完整攻略,我将进行详细讲解,解释其中的概念和示例。 什么是模块规范? 在Node.js中,模块是指一段封装了特定功能的代码,类似于Object-Oriented Programming中的“对象”。而模块规范,则是指Node.js对于模块定义、导入、使用等方面的一套标准规范。在Node.js中,主要有两种模块规…

    node js 2023年6月8日
    00
  • el-tree树组件懒加载(后端上千条数据前端进行处理)

    el-tree树组件可以用于显示层级结构的数据,但是默认情况下,el-tree会一次性加载所有数据,如果数据量非常大,会导致页面卡顿严重。为了解决这个问题,我们可以采用el-tree的懒加载功能,在需要加载子节点时再请求数据。本篇攻略将会介绍如何使用el-tree的懒加载功能,以及如何处理大量的数据。 什么是el-tree树组件懒加载? el-tree树组件…

    node js 2023年6月8日
    00
  • Node.js实现前端后端数据传输加密解密

    下面是详细讲解“Node.js实现前端后端数据传输加密解密”的完整攻略: 1. 确定加密方案 要实现前端后端数据传输加密解密,需要确定一个加密方案。推荐使用AES加密算法,它是一种对称加密算法,既可以用于加密数据,也可以用于解密数据。同时,它的加解密速度也较快,且安全性较高。 2. 安装crypto模块 Node.js自带了crypto模块,可以用于进行加密…

    node js 2023年6月8日
    00
  • 使用koa2创建web项目的方法步骤

    使用koa2创建web项目的方法步骤可以分为以下几步: 步骤一:安装Node.js 首先需要安装Node.js,可以在官网下载:https://nodejs.org/zh-cn/ 步骤二:安装koa2 安装koa2可以使用npm进行安装,在命令行中输入以下命令: npm install koa 步骤三:创建一个koa2项目 在命令行中输入以下命令,创建一个空…

    node js 2023年6月8日
    00
  • 实例详解Nodejs 保存 payload 发送过来的文件

    下面是关于“实例详解Nodejs 保存 payload 发送过来的文件”的完整攻略: 1. 背景说明 在开发web应用程序时,经常需要通过上传文件的方式与客户端进行交互。客户端可以通过表单提交文件数据,也可以通过使用JavaScript编写发送文件的客户端来向服务器发送文件。 本文主要介绍使用Node.js处理通过POST请求发送的文件上传数据。 2. 如何…

    node js 2023年6月8日
    00
  • 我的NodeJs学习小结(一)

    以下是对“我的NodeJs学习小结(一)”的完整攻略。 一、Node.js简介 Node.js 是一个基于 JavaScript 语言的开源、跨平台、事件驱动、非阻塞 I/O 的服务器端 JavaScript 运行环境,让 JavaScript 成为了一种与后端编程口语相通的语言。Node.js 使用了一个轻量级的、基于事件驱动的 I/O 模型,使其轻量又高…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部