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

使用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,收工!如果可以实现记得点赞分享,谢谢老铁~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

股票要怎么买入卖出?

股票账户终于开好了&#xff01;恭喜你马上就可以开启刺激的炒股之旅了&#xff01;不过第一次买股票的你是不是还不知道怎么个买法呢&#xff1f;别担心~贴心的汇小鲸带着教程来了&#xff0c;咱们一起看看吧&#xff01; 首先一点&#xff0c;大家得知道&#xff1a;开好户还…

Leetcode 136. 只出现一次的数字

class Solution {//任何数与0异或结果都是原来的数//任何数和自身异或结果都是0//异或满足交换律和结合律//a ^ b ^ a (a ^ a) ^ b 0 ^ b bpublic int singleNumber(int[] nums) {int res nums[0];for(int i 1; i < nums.length; i){res ^ nums[i];}return res;} }

2023第十二届“认证杯”数学中国数学建模国际赛赛题A完整解析

A题完整题解 写在前面假设数据预处理 问题一1 基于自适应ARIMA-BP神经网络模型的影响因素预测1.1 ARIMA模型的建立1.2 BP神经网络模型的建立1.3 基于GABP神经网络的预测模型构建1.4 自适应混合ARIMA-BP神经网络模型的建立1.5 模型求解 代码Q1_1.mQ1_2.m 完整代码与论文获取 写在…

JavaScript短路求值

之前我们学习过两个运算符&#xff0c;and和OR&#xff0c;但是我们之前还没有发挥出他们全部的潜力&#xff1b;它们也可以用于短路求值&#xff1b; OR || 可以使用任何值&#xff0c;也可以返回任何值&#xff08;不仅仅是布尔型&#xff09;&#xff0c;我们成为短路求值…

数据结构—二叉树

文章目录 10.二叉树(1).二叉树的基本概念(2).遍历#1.前序遍历#2.中序遍历#3.后序遍历#4.非递归中序遍历 (3).中序前/后序建树#1.中序前序遍历建树#2.中序后序遍历建树 (4).递归和二叉树基本操作#1.求树高#2.求结点数#3.求叶子结点数#4.复制树#5.判断两棵树是否相等 (5).特殊二叉…

xss漏洞后端进行html消毒

import org.jsoup.Jsoup;public static String sanitizeHtml(String input) {// 使用 Jsoup 消毒 HTMLreturn Jsoup.clean(input, Safelist.relaxed());}public static void main(String[] args) {String userInput "<p><script>alert(1)</script>Safe…

Linux:vim的简单使用

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、vim的基本概念二、vim的基本操作三、vim正常模式命令集四、vim底行模式命令集五、.xxx.swp的解决总结 前言 本文是对Linux中vim使用的总结 一、vim的基本概念 …

02-使用Git命令操作远程仓库,如克隆或添加远程仓库,拉取或推送内容

操作远程仓库 创建远程仓库 第一步: 访问GitHub官网,登录自己的账号创建一个远程仓库 第二步: 设置远程仓库的信息(一般远程库的名字和本地库的名字一样),仓库创建完成后可以看到仓库地址(每个仓库都会对应一个网络地址) 第三步: 查看本地仓库对应的Https/SSH连接 远程仓库命…

apk和小程序渗透测试

apk和小程序渗透测试 文章目录 apk和小程序渗透测试小程序渗透测试apk和小程序的抓包安装证书apk渗透 小程序渗透测试 小程序的默认路径在 C:\Program Files (x86)\Tencent\WeChat\WeChatApp 使用UnpackMiniApp、wxappUnpacker工具完成逆向 先打开UnpackMiniApp.exe工具 选…

Kotlin学习——kt里的作用域函数scope function,let,run,with,apply,also

Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复用代码&#xff0c;以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

超全能!PDF转换+套用模板+在线制作电子画册的网站

上班族的朋友们&#xff0c;制作电子画册很苦恼吧&#xff01;没有专业设计水准的&#xff0c;或是想偷偷小懒的看看这里&#xff01;小编说的这些对你的工作非常有效&#xff01; 想要轻轻松松就能制作能与专业设计师们媲美的电子画册&#xff0c;当然是需要一款超全能的工具&…

ESP32CAM视频查看实践

利用ESP32cam的摄像头进行视频查看。视频画质确实模糊&#xff0c;不过不妨碍其高性价比。 1、选择开发板及串口 2、打开例程 3、修改热点和摄像模式 4、复制链接查看 手机浏览器打开

LeetCode Hot100 169.多数元素

题目&#xff1a; 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 方法一&#xff1a;哈希表 ​ class Solution {public int…

Go 语言注释教程

注释是在执行时被忽略的文本。 注释可用于解释代码&#xff0c;使其更易读。 注释还可用于在测试替代代码时防止代码执行。 Go支持单行或多行注释。 Go单行注释 单行注释以两个正斜杠&#xff08;//&#xff09;开头。 在//和行尾之间的任何文本都将被编译器忽略&#xf…

常用OSPF命令有哪些?详细解释~赶快收藏起来!

OSPF&#xff08;Open Shortest Path First开放式最短路径优先&#xff09;是一种动态路由协议&#xff0c;属于内部网关协议(Interior Gateway Protocol,简称IGP)&#xff0c;是基于链路状态算法的路由协议。 配置OSPF会使用到哪些命令&#xff1f; 1、OSPF &#xff08;1&…

C/C++11 语法/概念易错总结(1)

文章目录 缺省参数函数重载引用引用和指针内联宏的优缺点auto范围forNULL和nullptr 缺省参数 半缺省参数必须从右往左依次来给出&#xff0c;不能间隔着给 void Func(int a, int b 10, int c 20){cout<<"a "<<a<<endl;cout<<"b &…

uniapp运行到安卓基座app/img标签不显示

img是html中的标签&#xff0c;他也是一个单标签 image属于服务器控件&#xff0c;是个双标签 问题&#xff1a;uniapp运行到app安卓基座后图片无法显示 原因&#xff1a;自己使用了img标签&#xff0c;而且输入路径无提示&#xff0c;img标签导致图片不显示 解决&#xff…

阅读文献总结2023

阅读文献基于卷积神经网络多源融合的网络安全态势感知模型 阅读文献 基于卷积神经网络多源融合的网络安全态势感知模型 题目基于卷积神经网络多源融合的网络安全态势感知模型文章信息&#xff1a;年份2023发文单位山西财经大学收录刊会计算机科学 &#xff08;北大核心&#…

微服务架构:解析分布式系统的演进

目录 微服务是什么&#xff1f; 微服务的优势 微服务的挑战 应对微服务挑战的方法 结论 在当今快速发展的软件开发领域&#xff0c;微服务架构成为一种备受瞩目的设计理念&#xff0c;被广泛应用于构建灵活、可扩展的分布式系统。本文将深入探讨什么是微服务&#xff0c;为…

掌握HarmonyOS框架的ArkTs如何管理和共享状态数据

ARKTS&#xff08;Ark TypeScript&#xff09;是HarmonyOS应用框架的一部分&#xff0c;提供了一种灵活而强大的状态管理机制。在ARKTS中&#xff0c;AppStorage和LocalStorage是两个关键的概念&#xff0c;它们分别用于应用级和页面级的状态共享。通过深入了解这两个特性&…