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日

相关文章

  • 捕获未处理的Promise错误方法

    当Promise在执行过程中出现错误,但该Promise的错误处理函数没有被调用时,这时就需要通过捕获未处理的Promise错误方法来处理该错误。 以下是完整的攻略: 1. 使用unhandledRejection事件捕获未处理的Promise错误 Node.js提供unhandledRejection事件,用于捕获未处理的Promise错误。当一个Prom…

    node js 2023年6月8日
    00
  • Node.js中路径处理模块path详解

    下面我将为你讲解“Node.js中路径处理模块path详解”的完整攻略。 一、路径处理模块path概述 路径处理模块path是Node.js内置的一个模块,主要提供了一系列关于处理路径的方法。在Node.js开发中,对于文件和文件夹的操作,我们不仅需要知道文件或文件夹的名称,还需要知道它们所存储的路径。而path模块就是专门用来处理路径的。 下面我们将介绍p…

    node js 2023年6月8日
    00
  • Node.js服务Docker容器化应用实践小结

    当我们需要将一个Node.js应用部署到生产环境时,Docker容器化是一个非常好的选择。其主要优点是使得应用部署变得非常容易,同时也方便了应用的扩展及做负载平衡。下面我们将介绍一下如何将一个Node.js应用Docker化,并对相关知识进行一些说明。 前置知识 在开始学习Docker容器化应用实践前,需要掌握以下知识: Docker基本术语和概念 Node…

    node js 2023年6月8日
    00
  • nodejs中方法和模块用法示例

    下面是“nodejs中方法和模块用法示例”的完整攻略: 概述 Node.js是一个基于V8引擎的JavaScript运行环境,它能够使JavaScript运行在服务器端,具有事件驱动、非阻塞I/O等特性。在Node.js中,对于一些常用的功能,比如文件读写、网络通信等,Node.js提供了一系列方法和模块,开发者只需要调用这些方法和模块,就能快速地实现自己的…

    node js 2023年6月8日
    00
  • node.js中EJS 模板快速入门教程

    那我就来详细讲解一下“Node.js中EJS模板快速入门教程”的完整攻略。 介绍 EJS(Embedded JavaScript)是一种模板引擎,使用 JavaScript 作为标示语言,可以简单方便地将数据渲染到 HTML 页面中。在 Node.js 中,使用 EJS 可以快速实现页面渲染,并且与 Express 应用程序集成方便。 安装 在使用 EJS …

    node js 2023年6月8日
    00
  • TypeScript的安装、使用、自动编译的实现

    TypeScript是一种JavaScript的超集语言,它添加了类型注释和一些新特性,可以提高开发效率和代码质量。下面是TypeScript的安装、使用和自动编译的实现攻略。 安装 安装Node.js 首先需要安装Node.js,可以在官网下载安装包进行安装。 安装TypeScript 打开命令行工具,使用以下命令安装TypeScript: npm ins…

    node js 2023年6月8日
    00
  • 详解从NodeJS搭建中间层再谈前后端分离

    详解从NodeJS搭建中间层再谈前后端分离 前言 随着前后端分离的流行,前端在项目中的地位越来越重要。在这个过程中,前端负责视觉交互和实现与用户交互相关的逻辑,而后端主要负责数据存储和提供API服务。但是由于前后端完全分离,在跨域等问题上会遇到很多麻烦。而中间件的出现可以很好地解决这个问题。本篇文章将详解如何使用NodeJS搭建一个中间层,来达成前后端分离的…

    node js 2023年6月8日
    00
  • 基于JavaScript编写一个图片转PDF转换器

    下面是基于JavaScript编写一个图片转PDF转换器的完整攻略。 步骤一:安装依赖 首先需要安装两个JavaScript库:pdf-lib和fs。 pdf-lib是用于创建和操作PDF文档的JavaScript库。 fs是用于读取和写入文件的JavaScript库。 可以使用npm在命令行中进行安装: npm install pdf-lib fs 步骤二…

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