百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Nodejs文件上传、监听上传进度(nodejs 监听文件变化)

liuian 2025-04-06 18:08 15 浏览

文件上传如果加上进度条会有更好的用户体验(尤其是中大型文件),本文使用Nodejs配合前端完成这个功能。

前端我们使用 FormData 来作为载体发送数据。

效果

前端部分

HTML 部分 和 Js 部分



// 获取 input file 的 dom 对象
const inputFile = document.querySelector('#file');

// 监听 change 事件
inputFile.addEventListener('change', function() {
    // 使用 formData 装载 file
    const formData = new FormData();
    formData.append('file', this.files[0]);
    
    // 上传文件
    upload(formData);
})

下面我们实现upload 方法。

使用 XMLHttpRequest 的方式

const upload = ( formData ) => {
    const xhr = new XMLHttpRequest();
    // 监听文件上传进度
    xhr.upload.addEventListener('progress', function(e) {
      if (e.lengthComputable) {
        // 获取进度
        const progress = Math.round((e.loaded * 100) / e.total);
        
        document.querySelector('#progress').setAttribute('value', progress);
      }
    },false);
    
    // 监听上传完成事件
    xhr.addEventListener('load', ()=>{
        console.log('上传完成')
    }, false);
    
    xhr.open('post', 'http://127.0.0.1:3000/upload');
    xhr.send(formData);   
}

使用 jQuery 的 ajax 上传

jQuery 目前的使用量依然庞大,那么使用 jQuery 的 ajax 如何监听文件上传进度呢:

const upload = ( formData ) => {
    $.ajax({
        type: 'post',
        url: 'http://127.0.0.1:3000/upload',
        data: formData,
        // 不进行数据处理和内容处理
        processData: false,
        contentType: false,
        // 监听 xhr
        xhr: function() {
          const xhr = $.ajaxSettings.xhr();
          if (xhr.upload) {
            xhr.upload.addEventListener('progress', e => {
                const { loaded, total } = e;
                var progress = (loaded / total) * 100;
                document.querySelector('#progress').setAttribute('value', progress);
              },
              false
            );
            return xhr;
          }
        },
        success: function(response) {
          console.log('上传成功');
        }
      });
}

使用 axios 上传并监听进度

axios 使用量非常大,用它监听文件上传更简单,代码如下:

const upload = async ( formData ) => {

    let config = {
        // 注意要把 contentType 设置为 multipart/form-data
        headers: {
          'Content-Type': 'multipart/form-data'
        },
        
        // 监听 onUploadProgress 事件
        onUploadProgress: e => {
            const {loaded, total} = e;
            // 使用本地 progress 事件
            if (e.lengthComputable) {
                let progress = loaded / total * 100;
                document.querySelector('#progress').setAttribute('value', progress);
            }
        }
      };

      const { status } = await axios.post('http://127.0.0.1:3000/upload', formData, config);
      if (res.status === 200) {
          console.log('上传完成');
      }
}

Nodejs 部分

这部分比较简单,其实就是单纯的文件上传,我们用 Koa 来实现.

环境搭建及依赖包安装

这里使用 koa2,安装以下依赖包:

  • koa
  • @koa/router: koa 的路由
  • @koa/cors:用于跨域
  • koa-body: 解析 body 数据
  • nodemon: 使用它启动服务,带有热更新

代码部分

const Koa = require('koa');
const Router = require('@koa/router');
const koaBody = require('koa-body');
const path = require('path');
const fs = require('fs');
const cors = require('@koa/cors');

const app = new Koa();
const router = new Router();

router.all('/upload', async ctx => {
  // 处理文件上传    
  const res = await dealFile(ctx);

  res && (ctx.body = {
      status: 200,
      msg: 'complete'
    });
});

// 中间件部分
app.use(cors());
app.use(
  koaBody({
    multipart: true,
    formidable: {
      maxFileSize: 2000 * 1024 * 1024 //最大2G
    }
  })
);
app.use(router.routes());
app.use(router.allowedMethods());

app.listen(3000);

dealFile 方法处理上传的文件

出于性能考虑,操作file 毫无疑问要使用stream。 我们要监听文件流end事件,由于无法在事件回调里返回响应,因为会报 404,所以需要使用 Promise 来封装一下,然后用 async、await

const dealFile = ctx => {
  const { file } = ctx.request.files;

  const reader = fs.createReadStream(file.path);
  const writer = fs.createWriteStream(
    // 文件上传到 image 文件夹中
    path.resolve(__dirname, './image', file.name)
  );

  return new Promise((resove, reject) => {
  
    reader.pipe(writer);
    
    reader.on('end', () => {
      resove(true);
    });
    
    reader.on('error', err => {
      throw err;
    })
    
  });
};

到这里就全部完成了。

这里注意一下:前端监听文件进度不需要后端有什么特殊处理,后端仅仅是做了文件流的写入而已。


作者:Ve
链接:
https://juejin.im/post/5e7ca27df265da42ac0294e5

来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关推荐

谷歌Gemini 2.5全线爆发!勇战濒死恐慌,却被宝可梦吓到当场宕机

编辑:定慧桃子【新智元导读】今天,谷歌旗舰Gemini2.5三箭齐发,首次亮相轻量版2.5Flash-Lite。最新70页技术报告中,爆料了Gemini2.5在玩宝可梦濒死时,惊现类人的恐慌,...

Claude 4系列模型正式发布,号称“世界上最好的”AI编程模型

当地时间5月22日,Anthropic在其首次开发者大会上,正式发布了其下一代Claude模型系列:ClaudeOpus4和ClaudeSonnet4。该公司在公告中高调宣称,...

p5.js 中文入门教程(p5js和js怎么转换)

本文简介点赞+关注+收藏=学会了本文的目标是和各位工友一起有序的快速上手p5.js,会讲解p5.js的基础用法。本文会涉及到的内容包括:项目搭建p5.js基础2D图形文字图形样式...

ElasticSearch中文分词插件(IK)安装

坚持原创,共同进步!请关注我,后续分享更精彩!!!前言ElasticSearch默认的分词插件对中文支持很不友好。一段话按规则会以每个中文字符来拆解,再分别建立倒排索引。如"中华人民共和国国歌...

ELK 教程 - 发现、分析和可视化你的数据

【注】本文译自:ELKStackTutorial-GettingStartedWithELKStack|Edureka随着越来越多的IT基础设施转身云计算,对公共云安全工具...

网络安全事件技术排查(网络安全事件排查有哪些因素)

1.文件分析a)文件日期与异常文件检测文件时间检查:Windows:通过文件属性查看创建/修改时间,但需注意攻击者可能伪造时间(如使用工具修改文件时间戳)。Linux:使用ls-l或sta...

日志文件转运工具Filebeat笔记(日志文件生成原理)

一、概述与简介Filebeat是一个日志文件转运工具,在服务器上以轻量级代理的形式安装客户端后,Filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读),并将来自...

Spring Boot 分布式系统中的日志打印设计:实战指南

在分布式系统中,日志是排查问题、监控系统状态和进行事后分析的“生命线”。然而,随着微服务架构的普及,日志的管理和检索变得愈发复杂。尤其是在生产环境中,当问题发生时,如何快速定位相关日志成为了一个关键挑...

Loki日志系统取代ELK?(日志系统 elk)

一、Loki是什么?Loki是由GrafanaLabs开源的一个水平可扩展、高可用性,多租户的日志聚合系统的日志聚合系统。它的设计初衷是为了解决在大规模分布式系统中,处理海量日志的问题。Loki采用...

20 个最热门的 MCP Server,收藏备用!

1.GitHubMCPServer功能:代码仓库管理、自动化代码审查、处理拉取请求(PR)、Issue跟踪。项目地址:https://docs.github.com/en/rest核心架构:基于...

ElasticSearch实现数据模糊搜索(el-select模糊搜索)

关注我的微信公众号:后端技术漫谈不定期推送关于后端开发、爬虫、算法题、数据结构方面的原创技术文章,以及生活中的逸闻趣事。我目前是一名后端开发工程师。主要关注后端开发,数据安全,网络爬虫,物联网,边缘计...

Linux 日志系统维护的实战示例(linux 日志文件系统)

Linux日志系统维护的实战示例,涵盖常见场景和工具:1.日志轮转与清理(Logrotate)问题:系统/var/log空间不足,需定期切割和清理旧日志。实战步骤:检查默认配置Logrotat...

日志分析平台——ELK安装配置(elk日志解析)

简介:ELK是(Elasticsearch、Logstash、Kibana)三个软件的集合简称。那么这三个软件分别扮演着一个什么样的角色呢?Elasticsearch:搜索引擎,主要任务是将日志索引并...

Docker上使用Elasticsearch,Logstash,Kibana

在对一个项目做性能测试时我需要处理我们web服务器的访问日志来分析当前用户的访问情况。因此,我想这是试用ELK的一个好机会。ELK栈首先要注意的是使用它是非常简单的。从决定使用ELK到在本机上搭一个...

.NET Core 性能监控(.net core性能对比)

一、.NETCore性能监控的重要性随着.NETCore应用程序的广泛应用,性能监控成为了保障应用稳定运行的关键环节。性能监控可以帮助开发者实时掌握应用状态,快速定位问题所在,并采取相应的...