前端大文件上传webuploader(react + umi)

news2024/11/17 9:29:45

使用WebUploader还可以批量上传文件、支持缩略图等等众多参数选项可设置,以及多个事件方法可调用,你可以随心所欲的定制你要的上传组件。

分片上传

1.什么是分片上传
分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块(我们称之为Part)来进行分别上传,上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件。

2.分片上传的场景

1.大文件上传

2.网络环境环境不好,存在需要重传风险的场景

断点续传

1、什么是断点续传
断点续传是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传或者下载未完成的部分,而没有必要从头开始上传或者下载。本文的断点续传主要是针对断点上传场景。

2、应用场景
断点续传可以看成是分片上传的一个衍生,因此可以使用分片上传的场景,都可以使用断点续传。

具体使用

1.引入库

使用Web Uploader文件上传需要引入三种资源:JS, CSS, SWF。

先将webuploader.js , webuploader.css , jquery.min.js 放到静态资源public/scripts 文件中如:

在这里插入图片描述
由于我是react + Umi 的项目,在config.ts 文件中进行配置,所以导入方式:

links: [
    {
      href: './scripts/webuploader.css',
      rel: 'preload',
    },
  ],
  /**
   * @name <head> 中额外的 script
   * @description 配置 <head> 中额外的 script
   */
  headScripts: [
    // 解决首次加载时白屏的问题
    { src: '/scripts/loading.js', async: true },
    {
      src: '/scripts/jquery.min.js',
      charset: 'utf-8',
      type: 'text/javascript',
    },
    {
      src: '/scripts/webuploader.js',
      charset: 'utf-8',
      type: 'text/javascript',
    },
    // `https://sandcastle.cesium.com/Sandcastle-header.js`,
    `window.WebUploader = WebUploader`,
  ],
2.业务组件

index.ts

<div>
	<div id="upload-container">
    	<span>点击或者拖拽到此处上传</span>
	</div>
	<span id="picker" class="showclass">点击上传文件</span>
	{uploading && (
	  <>
	     {uploader.current.getFiles()?.[0].name}
	     <Progress percent={percent} />
	   </>
	 )}
</div>

3.初始化

从前端代码可以看出上传文件为一个span文本,Web Uploader将其初始化成为
一个可以上传文件的按钮

import { useRef, useEffect, useState } from "react";
import {
  Progress,
} from "antd";
const Index = () => {
  const uploader = useRef(null as any);
  const [percent, setPercent] = useState(0);
  const [errRes, setErrRes] = useState({} as any);
  const [uploading, setUploading] = useState(false);
  useEffect(() => {
    $('#upload-container').click(function(event) {
     	$("#picker").find('input').click();
  	});
  	// 取消上传
	$('.upload-list').on('click', '.btn-remove', function(){
   		// 从文件队列中删除某个文件id
   		file_id = $(this).data('id');
   		uploader.current.removeFile(file_id, true); // 从队列中删除
	    // console.log(uploader.getFiles()) // 队列显示还在  其实已经删除
	});
	// 重新上传
	$('.upload-list').on('click', '.upload-item__progress span', function(){
	    uploader.current.retry($(this).data('file'));
	});
	// 刷新容器(解决文件上传按钮失效问题)
    $("#picker").hide();
    $('#forecastSelect4').change(function(){
        $("#picker").show();
        uploader.refresh();//刷新容器 解决隐藏后失效问题
    });
    initUploader();
  });

  const initUploader = () => {
    const { WebUploader } = window as any;
    uploader.current = WebUploader.create({
      auto: false, // 选完文件后,是否自动上传。
      //duplicate:true, // 可重复上传
      swf: "/Uploader.swf", // swf文件路径
      server: "/api/data/xxx", // 文件接收服务端。
      pick: {
        id: "#picker",
        label: "Select Data File",
        multiple: false,
      }, // 内部根据当前运行是创建,可能是input元素,也可能是flash. 这里是div的id
      // multiple: true, // 选择多个
      chunked: true, // 开起分片上传。
      threads: 5, // 上传并发数。允许同时最大上传进程数。
      method: "POST", // 文件上传方式,POST或者GET。
      // fileSizeLimit: 1024 * 1024 * 100 * 100, //验证文件总大小是否超出限制, 超出则不允许加入队列。
      // fileSingleSizeLimit: 1024 * 1024 * 100 * 100, //验证单个文件大小是否超出限制, 超出则不允许加入队列。
      formData: {},
      fileVal: "file", // [默认值:'file'] 设置文件上传域的name。
      accept: {
        title: "package",
        extensions: "tar.gz,tgz,tar,zip",
        mimeTypes: ".tar.gz,.tgz,.tar,.zip",
      },
      headers: {
        token: localStorage.getItem("token"),
      },
    });

    uploader.current.on(
      "uploadBeforeSend",
      async function ({ file }: any, data: any) {
        // data.md5 = file.md5; // md5 在父组件中提前一步注册
        if (data.hasOwnProperty("chunk")) {
          data.chunk = data.chunk + 1;
        } else {
          data.chunk = 1;
        }
      }
    );

    uploader.current.on("beforeFileQueued", async (file: any) => {
      uploader.current.reset();
    });

	// 1.添加文件到队列时
    uploader.current.on("fileQueued", async (file: any) => {
      form
        .validateFields()
        .then((values: any) => {
          createProjectRequest({
            project_name: values.project_name,
            sub_project_name: values.sub_project_name,
          }).then((res: any) => {
            setUploading(true);
            fileRef.current = file;
            subPid.current = res.sub_project_id;

            uploader.current.upload();
          });
        })
        .catch((err: any) => {
          uploader.current.reset();
        });
    });
	// 2.文件上传过程中添加进度显示
    uploader.current.on("uploadProgress", (file: any, p: number) => {
      const _p = Math.floor(p * 100);
      setPercent(_p > 99.99 ? 99.99 : _p);
    });
    
	// 3.文件上传成功或失败时触发
    uploader.current.on("uploadSuccess", (file: any, response: any) => {
      completeProjectData({
        name: file.name,
        size: file.size,
        sub_project_id: subPid.current,
      })
        .then((res) => {
          setPercent(100);
          message.success("导入成功");
        })
        .catch(() => {
          setPercent(100);
        });
    });
}

export default Index;

OK,收工!如果可以实现记得点赞分享,谢谢老铁~

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

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

相关文章

stm32项目中重定向printf打印不出来东西?三种解决方案

项目场景&#xff1a; 在stm32项目中为了调试将某些参数打出来&#xff0c;重定向printf 问题描述 printf打印不出东西 缓冲区满了才打印出来 原因分析&#xff1a; 使用printf函数必须等到缓冲区满或程序结束时&#xff0c;才进行写入到屏幕 解决方案&#xff1a; 解决方…

react实现加载动画

1.Spinning.tsx import "./Spinning.scss";interface Props {isLoading: boolean;children?: React.ReactNode; }const Spinning: React.FC<Props> ({isLoading true,children }) > {return <div className{spinning-wrapper${isLoading ? " l…

MySQL:找回root密码

一、情景描述 我们在日常学习中&#xff0c;经常会忘记自己的虚拟机中MySQL的root密码。 这个时候&#xff0c;我们要想办法重置root密码&#xff0c;从而&#xff0c;解决root登陆问题。 二、解决办法 1、修改my.cnf配置文件并重启MySQL 通过修改配置文件&#xff0c;来跳…

海外IP罗拉rola正版去哪里找?

免费海外IP代理能用吗&#xff1f;和收费的有哪些差异&#xff1f; 如今在这个大数据时代&#xff0c;无论你从事哪个行业&#xff0c;都离不开数据&#xff0c;尤其是做跨境电商的&#xff0c;更一步都离不开海外IP代理&#xff0c;无论是网站引擎优化还是营销推广、数据抓取…

基于SpringBoot实现SSMP整合

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

Android File Transfer for Mac:畅享强大的安卓文件传输工具

作为一款功能强大的安卓文件传输工具&#xff0c;Android File Transfer for Mac&#xff08;以下简称AFT&#xff09;为Mac用户提供了便捷快速的安卓设备文件管理体验。无论是传输照片、音乐、视频还是文档&#xff0c;AFT都能满足你的需求&#xff0c;让你的文件传输更加高效…

Windows11系统下内存占用率过高如何下降

. # &#x1f4d1;前言 本文主要是win11系统下CPU占用率过高如何下降的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日…

FH Admin Shiro反序列化漏洞复现

0x01 产品简介 FH Admin 是一款 java 快速开发平台。 0x02 漏洞概述 FH Admin CMS 存在 shiro 反序列化漏洞&#xff0c;该漏洞源于软件存在硬编码的 shiro-key&#xff0c;攻击者可利用该 key 生成恶意的序列化数据&#xff0c;在服务器上执行任意代码&#xff0c;执行系统命…

从零开发短视频电商 在AWS上用SageMaker部署开源模型并用Java SDK调用

文章目录 1.创建AWS账户2.登录AWS3.创建域4.部署模型方式一 使用JumpStart可视化界面部署内置的模型方式二 采用python脚本部署私有模型5.调用模型AWS Java SDK调用Http调用6.监控7.自动扩缩容1.创建AWS账户 需要准备好邮箱一个,支持visa功能的信用卡一个。然后到aws上自己去…

vue 修改 this.$confirm 的文字样式、自定义样式

通常使用 confirm 确认框时&#xff0c;一般这样写&#xff1a; <template><el-button type"text" click"open">点击打开 Message Box</el-button> </template><script>export default {methods: {open() {this.$confirm(此…

什么样的SSL证书比较好?

首先需要明确的是最适合自己的就是最好的SSL证书。目前市场上的证书种类很多&#xff0c;那怎么才能挑选出最适合自己的呢&#xff1f;我罗列了几个需要考虑的方面。 1.证书类型&#xff1a;根据您的需求选择合适的证书类型。例如&#xff0c;如果您需要验证公司信息&#xff0…

Python 中的 FileSystem Connector:打通文件系统的便捷通道

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是涛哥&#xff0c;今天为大家分享 Python 中的 FileSystem Connector&#xff1a;打通文件系统的便捷通道&#xff0c;全文4100字&#xff0c;阅读大约11分钟。 在现代软件开发中&#xff0c;文件系统是不可或…

Android studio Load error:undefined path variables

android stuido 报错 Load error&#xff1a;undefined path variables Gson is undefined 处理方法&#xff1a; 点击进行Sync Project with Gradle Files

数据结构算法-选择排序算法

引言 说起排序算法&#xff0c;那可就多了去&#xff0c;首先了解什么叫排序 以B站为例&#xff1a; 蔡徐坤在B站很受欢迎呀&#xff0c;先来看一下综合排序 就是播放量和弹幕量&#xff0c;收藏量 一键三连 都很高这是通过一些排序算法 才能体现出综合排序 蔡徐坤鬼畜 按照播…

2023年小美赛A题论文无偿分享!!

A题论文分享 链接&#xff1a; https://pan.baidu.com/s/1cltswCuiPG30HhuysrEVuA 提取码&#xff1a;sxjm 欢迎大家批评指正&#xff0c; 为了方便大家摘抄&#xff0c;所有内容均为中文。但是&#xff01;&#xff01;该比赛是英文论文竞赛&#xff0c;大家需要全部自行…

鸿蒙(HarmonyOS)应用开发——容器组件(Grid组件)

前言 前面一篇文章中&#xff0c;已经说了List组件。那么接下来就是容器组件中的Grid组件 #mermaid-svg-oz1b7w45ASmMlZFa {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-oz1b7w45ASmMlZFa .error-icon{fill:#5522…

centos7 yum安装jdk1.8

1.列出可安装版本 yum -y list java* 2.安装 yum -y install java-1.8.0-openjdk* 3.检查命令 java -version javac java

Leetcode—2661.找出叠涂元素【中等】

2023每日刷题&#xff08;四十六&#xff09; Leetcode—2661.找出叠涂元素 题意解读 题目意思就是&#xff0c;按照arr数组从左到右的顺序遍历各个arr[i]&#xff0c;涂抹这个值在矩阵中对应位置的网格&#xff0c;一旦你发现它所在的行或者列满员了&#xff0c;就返回这个i…

MyBatis-逆向工程

1.简单生成 1.添加依赖和插件 <dependencies><!-- MyBatis核心依赖包 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version></dependency><!-- MySQL驱动…

抑郁症由什么引起?

抑郁症的发生并不是单一原因所导致&#xff0c;而是多种因素相互作用的结果。以下是一些主要的原因&#xff1a; 首先&#xff0c;生物学因素在抑郁症的发病中起到了关键作用。研究显示&#xff0c;抑郁症可能与遗传有关&#xff0c;家族中有患抑郁症的成员会增加个体患病的风…