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

yizhihongxing

下面我将详细讲解实现“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日

相关文章

  • nodejs读取本地中文json文件出现乱码解决方法

    这里为大家提供一种解决nodejs读取本地中文json文件乱码的方法。 问题描述 在使用Node.js读取本地JSON文件的时候,如果文件中存在中文字符,有时会出现乱码的问题,即中文字符在程序中无法正常显示。原因是Node.js读取数据时默认编码为UTF-8,而中文JSON文件的编码常为GB2312。 解决方法 为了避免这个问题,我们需要将读取文件时的编码设…

    node js 2023年6月8日
    00
  • Node的事件处理和readline模块详解

    Node.js 是一个基于事件驱动、非阻塞 I/O 的 JavaScript 运行时环境。事件处理是 Node.js 的核心机制之一。本文将详细讲解 Node.js 事件处理机制以及 readline 模块,希望能够为大家提供一定的参考。 Node.js 事件处理机制 Node.js 的事件处理机制建立在 EventEmitter 类之上,提供了一种处理事件…

    node js 2023年6月8日
    00
  • node.js中的http.response.end方法使用说明

    我来详细讲解一下node.js中的http.response.end方法使用说明。 http.response.end方法是什么? 在node.js中,当服务器收到客户端的请求后,可以使用http.response对象向客户端发送响应。而http.response对象中的end()方法就是用来结束响应并发送数据给客户端的。 http.response.end…

    node js 2023年6月8日
    00
  • javascript实现双端队列

    下面是详细讲解 JavaScript 实现双端队列的完整攻略,包含以下内容: 双端队列的介绍 实现双端队列的方法 示例说明 1. 双端队列的介绍 双端队列是一种特殊的队列,它允许从两端进行数据的插入和删除操作。与普通队列相比,双端队列拥有更加丰富的操作,可以满足更多的需求。 2. 实现双端队列的方法 实现双端队列的方法有多种,其中最常见的方法是使用数组来实现…

    node js 2023年6月8日
    00
  • nodejs 搭建简易服务器的图文教程(推荐)

    下面是详细的“nodejs 搭建简易服务器的图文教程(推荐)”的攻略。 基本概念 Node.js是一个基于Chrome V8引擎的JavaScript运行时。它可以解析和执行JavaScript代码,并在服务器端运行,可以联系上下文环境并直接访问OS底层库的服务器环境。Node.js在后端开发领域发挥着越来越重要的作用,我们可以使用Node.js轻松地搭建一…

    node js 2023年6月8日
    00
  • nodejs报digital envelope routines::unsupported错误的最新解决方法

    当在Node.js中使用TLS(Transport Layer Security)连接时,可能会遇到digital envelope routines::unsupported错误,这个错误通常表示您的证书格式不被TLS支持。以下是最新的解决方法: 1. 查看证书格式 首先需要使用以下命令来查看您的证书格式: openssl x509 -in /path/t…

    node js 2023年6月8日
    00
  • Java语言基于无向有权图实现克鲁斯卡尔算法代码示例

    Java语言基于无向有权图实现克鲁斯卡尔算法代码示例,可以分为下面几个步骤: 1. 了解克鲁斯卡尔算法 克鲁斯卡尔算法是一种用于求解最小生成树(Minimum Spanning Tree,简称MST)的算法,其通过按边权非递减的顺序将所有边加入生成树中。对于每一条边,都需判断它所在的两个点是否在同一个集合中,如果不在,则将它们合并,同时将边加入生成树中。 2…

    node js 2023年6月8日
    00
  • 深入聊一聊虚拟DOM与diff算法

    当我们使用框架来构建Web应用程序时,渲染UI通常是性能的瓶颈之一。因此,使用虚拟DOM(Virtual DOM)及其相应的算法可以加快渲染速度,提高用户体验。 什么是虚拟DOM 虚拟DOM是一个轻量级的JavaScript对象模型,代表页面中的真实DOM元素。它不依赖于任何框架和浏览器,可以轻松地进行跨平台开发。使用虚拟DOM,我们可以在不直接操作DOM的…

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