前端监控文件上传进度

前端:

<!doctype html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><!-- <form  method="post" onsubmit="event.preventDefault();"> --><inputtype="file"class="file"multipleonsubmit="event.preventDefault();"/><h1 class="upload-title"></h1><button class="cancle-upload">取消上传</button><!-- </form> --></body>
</html>
<script>let file = document.querySelector('.file');let uploadTitle = document.querySelector('.upload-title');let cancleUpload = document.querySelector('.cancle-upload');cancleUpload.addEventListener('click', function (e) {e.preventDefault();window.xhr?.abort();window.xhr = null;});function getFormData(file) {let formData = new FormData();formData.append('file', file);return formData;}function getXhr(formData) {let xhr = new XMLHttpRequest();xhr.open('post', 'http://localhost:3333/test', true);return xhr;}function addListenerXhr(xhr, formData) {xhr.upload.onload = function () {console.log('end');uploadTitle.innerHTML = '上传完成';};xhr.upload.ontimeout = function () {console.log('timeout');uploadTitle.innerHTML = '上传超时';};xhr.upload.onerror = function () {console.log('error');uploadTitle.innerHTML = '上传失败';};xhr.upload.onabort = function () {console.log('abort');uploadTitle.innerHTML = '上传取消';};xhr.upload.onprogress = function (e) {console.log(Math.floor((e.loaded / e.total) * 100) + '%');uploadTitle.innerHTML ='上传中 ' + Math.floor((e.loaded / e.total) * 100) + '%' + e.type;};xhr.upload.onloadstart = function () {console.log('start');uploadTitle.innerHTML = '开始上传';};xhr.send(formData);}file.addEventListener('change', function (e) {e.preventDefault();let file = this.files[0];let formData = getFormData(file);let xhr = getXhr(formData);addListenerXhr(xhr, formData);});
</script>

server:

const express = require('express');
const multer = require('multer');
const cors = require('cors');
const app = express();
const qs = require('qs');
const querystring = require('querystring');
app.use(cors());// app.setHeader('Access-Control-Allow-Origin', '*');
// 设置存储位置和文件名
const storage = multer.diskStorage({destination: function (req, file, cb) {cb(null, './uploads'); // 设置文件存储位置},filename: function (req, file, cb) {cb(null, file.originalname); // 设置文件名}
});const upload = multer({ storage: storage });// 使用 upload.single('file') 中间件处理上传的文件
app.post('/test', upload.single('file'), (req, res) => {console.log(req.file); // 打印接收到的文件// res.set('Access-Control-Allow-Origin', 'http://localhost:3333');res.send({ret_code: '0',msg: 'success',data: req.file});// res.set('content-type', 'multipart/form-data');
});// app.listen(3000, () => console.log('Server started on port 3000'));
app.listen(3333, () => {console.log('server is running at port 3000');
});let obj = {a:1111,v:333
}
// console.log(qs.stringify(obj));
// console.log(querystring.stringify(obj));

依赖:

{"name": "myvue","version": "0.1.0","private": true,"scripts": {"serve": "vue-cli-service serve","build": "vue-cli-service build","lint": "eslint  test1.js   --ext .js src/","lint:fix": "eslint test1.js  --ext  .js src/ vue-cli-plugin-gyk/  --fix","prepare": "husky install"},"lint-staged": {"*.{js,jsx,vue,ts,tsx}": ["npm run lint","git add"]},"dependencies": {"core-js": "^3.8.3","cors": "^2.8.5","express": "^4.18.2","multer": "^1.4.5-lts.1","qs": "^6.11.2","vue": "^2.6.14"},"devDependencies": {"@babel/core": "^7.12.16","@babel/eslint-parser": "^7.12.16","@vue/cli-plugin-babel": "~5.0.0","@vue/cli-plugin-eslint": "~5.0.0","@vue/cli-service": "~5.0.0","eslint": "^8.50.0","eslint-config-airbnb-base": "^15.0.0","eslint-plugin-import": "^2.28.1","eslint-plugin-vue": "^9.17.0","husky": "^8.0.3","lint-staged": "^14.0.1","vue-cli-plugin-gyk": "~1.0.1","vue-template-compiler": "^2.6.14"},"eslintConfig": {"root": true,"env": {"node": true},"extends": ["plugin:vue/essential","eslint:recommended"],"parserOptions": {"parser": "@babel/eslint-parser"},"rules": {}},"browserslist": ["> 1%","last 2 versions","not dead"]
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/202124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是 shell 脚本?

一、什么是 shell&#xff1f; Shell 是一个应用程序&#xff0c;它负责接收用户输入的命令&#xff0c;然后根据命令做出相应的动作&#xff0c; Shell 负责将应用层或者用户输入的命令传递给系统内核&#xff0c;由操作系统内核来完成相应的工作&#xff0c;然后将结果反馈给…

西门子 ULTRAMAT 23多组分气体分析仪 端子接线说明

后面板端子分布图 RS485接口 模拟量&#xff08;开关量&#xff09;接口 特此记录 anlog 2023年12月6日

天眼销为电销行业降低获客成本

当下&#xff0c;做电销的老板都有一个深刻体会&#xff1a;市场竞争越来越激烈&#xff0c;获客成本不断攀升&#xff0c;但效率不升返降&#xff0c;企业经营困难。特别是在这一两年&#xff0c;市场环境紧张&#xff0c;业务不好开展&#xff0c;更是雪上加霜。 销售也感觉…

1.3角色设计精要

一、角色设计流程 二、确定角色关键词 OW角色小美 关键词&#xff1a; 中国防守英雄冰与雪聪明的邻家大姐姐探索与冒险南极科考航天科技 OW角色猎空 关键词&#xff1a; 英国敏捷飞行员进攻英雄年轻动感活泼 三、收集素材和灵感 概念设计 由分析用户需求到生成概念产品一系…

FTP协议(PORT和PASV模式)

目录 FTP协议基本概念 PORT主动模式工作流程 PORT工作过程 PORT工作报文 PASV被动模式工作流程 PASV工作过程 PASV工作报文 FTP协议基本概念 FTP文件传输协议&#xff0c;用于在互联网上进行文件传输&#xff0c;基于C/S架构 FTP的连接模式 FTP采用双TCP连接方式 控制连…

OSG编程指南<十四>:OSG纹理渲染之普通纹理、多重纹理、Mipmap多级渐远纹理及TextureRectangle矩阵纹理

1、纹理映射介绍 物体的外观不仅包括形状&#xff0c;不同物体表面有着不同的颜色和图案。一个简单而有效地实现这种特性的方法就是使用纹理映射。在三维图形中&#xff0c;纹理映射&#xff08;Texture Mapping&#xff09;的方法运用广泛&#xff0c;使用该技术可以大大提高物…

校园教务管理系统

学年论文&#xff08;课程设计&#xff09; 题目&#xff1a; 信息管理系统 校园教务管理系统 摘要&#xff1a;数据库技术是现代信息科学与技术的重要组成部分&#xff0c;是计算机数据处理与信息管理系统的核心&#xff0c;随着计算机技术的发展&#xff0c;数据库技…

Python-列表详解(列表的创建、用法、遍历、注意事项、特点等)

本文有以下内容&#xff1a; 列表的创建 列表的下标索引注意事项 列表的访问 列表的增加元素 列表的删除元素 列表的任意删除元素 列表的查找元素 列表的查找元素位置 列表的插入任意位置 列表的遍历 列表的拼接方式 列表的切片操作以及注意事项 列表类似于其他语言的数组 列…

记录 | linux静态库和动态库的理解

hello.cpp&#xff1a; #include <cstdio>void hello() {printf("Hello, world!\n"); }main.cpp&#xff1a; #include <cstdio>void hello();int main() {hello();return 0; }静态库编译配置&#xff1a; cmake_minimum_required(VERSION 3.12) proj…

mysql面试题——索引创建与设计原则

一&#xff1a;哪些情况适合创建索引&#xff1f; 字段的数值有唯一性的限制 频繁作为 WHERE 查询条件的字段 经常 GROUP BY 和 ORDER BY 的列 DISTINCT 字段需要创建索引&#xff1a;有时候我们需要对某个字段进行去重 SELECT DISTINCT(student_id) FROM student_info;运行…

王学岗切面编程(AOP)最新配置

不懂啥是切面编程的看我这篇文章 本文主要讲解最新的切面编程配置 首先看下app的build.gradle界面&#xff0c;有两处配置 plugins {id("com.android.application")id("org.jetbrains.kotlin.android") // 配置1id("com.ibotta.gradle.aop")…

C++大小写字母转换

这内容确实很初级了&#xff0c;就是ascii码的加减转换类型输出&#xff0c;但是以往都是学学理论&#xff0c;好多东西还真掌握不扎实&#xff0c;现在通过实验了验证一下&#xff0c;代码如下 可以看到字母的大小写直接差了32&#xff0c;如果要进行转换的话对应加减就可以了…

C++ 获取当前目录下的指定后缀文件

获取指定目录下的所有指定格式文件&#xff0c;返回的列表将按照创建时间排序 注意&#xff1a;文件最早的在最前面 #include "shlwapi.h" #pragma comment(lib,"shlwapi.lib") #pragma comment(lib, "Version.lib ") #include <iostream&…

Redis Reactor事件驱动模型源码

前置学习&#xff1a;Redis server启动源码-CSDN博客 1、Redis服务器启动的时候就会就一直在轮询。 // 运行事件处理器&#xff0c;一直到服务器关闭为止 aeSetBeforeSleepProc(server.el,beforeSleep); aeMain(server.el);// 服务器关闭&#xff0c;停止事件循环 aeDeleteEven…

Hello World

世界上最著名的程序 from fastapi import FastAPIapp FastAPI()app.get("/") async def root():return {"message": "Hello World"}app.get("/hello/{name}") async def say_hello(name: str):return {"message": f"…

智慧配电运维系统解决方案

智慧配电运维系统依托电易云-智慧电力物联网&#xff0c;是一种基于云计算、物联网、大数据等先进技术的配电室运维管理系统&#xff0c;具有实时监测、智能分析、远程控制等特点&#xff0c;可以提高配电室的安全可靠性、运行效率和管理水平。 智慧配电运维系统解决方案通过以…

常见场景题-Redis的bitmap如何实现签到功能?

Redis 的 bitmap 实现签到系统&#xff1f; 答&#xff1a; 主要讲一下 Redis 原生的 bitmap 的使用方法&#xff0c;以及如何使用 bitmap 来实现签到功能 先来看一下如何使用 redis bitmap 的原生命令实现签到功能&#xff1a; 签到 我们先来设计 key&#xff1a;userid:y…

一文通关物理机Ubuntu22.04融合部署OpenStack

前言 因为博主笔记本是amd的&#xff0c;就最近搞了个小主机&#xff0c;就想装个云平台玩玩&#xff0c;搞了三四天才正儿八经弄完&#xff0c;摸了一大堆错误出来&#xff0c;在文章前面我会将这些需要注意的点列举出来。 环境 物理环境&#xff1a; i5 12450H 32G内存 无线…

css 3D背景反转实现

body{/* 透视 */perspective: 800px; } div{transform-style:preserve-3d;width:259px;height:396px;margin: 100px auto;position: relative; } div img{position: absolute;width:259px;height:396px;left:0;top:0;transition: all linear 2s;z-index: 0; } div img:nth-chil…