将AWS S3大文件文件上传相关的API集成为js文件,功能包括 多文件并行上传、文件分片上传、断点续传、文件分片合成、上传暂停、取消上传、文件上传进度条显示

地址

https://github.com/gk-1213/easy-s3/tree/main

easy-s3

将AWS S3大文件文件上传相关的API集成为js文件,功能包括多文件并行上传、文件分片上传、断点续传、文件分片合成、上传暂停、取消上传、文件上传进度条显示。

暂时不包括文件分片下载相关功能,可后续迭代。

使用方法:下载s3.js文件并引入到需要使用的js文件中,即可使用
具体使用示例可参照下文中的第二点

一、API

1、init

传入以下参数,初始化s3客户端

在这里插入图片描述

2、fileChange

加入文件上传任务,使用该方法

传入参数:

fileChange({ fileList, bucket, changeStatus, getSuspend, changeSharding } )   //注意,传入的是一个map/**fileList:文件信息数组,其内部元素的结构为{percentage: 0,//该文件的上传进度,如果不需要展示进度的话,可以不传 falsestatus: 'wait',//文件上传的状态  truefile: file,//需要上传的文件   trueneedSuspend: false,//是否暂停  truesharding: [],//分片数组,该文件已经上传了那些分片  trueshardSize: 32 * 1024 * 1024//该文件每个分片的大小   true}
*//**bucket:文件上传到s3上的bucket名称
*//**changeStatus:一个事件,前端页面定义的可以改变文件上传的状态的事件示例:changeStatus(name, val) {//传入参数 name:文件名称   val:文件状态for (let i = 0; i < this.fileList.length; i++) {if (this.fileList[i].file.name == name) {this.fileList[i].status = val;if (val === 'success') {this.fileList[i].percentage = 100;}break;}}},*//**getSuspend:一个事件,前端页面定义的可以获取该文件上传是否暂停的事件示例:getSuspend(name) {//传入参数 name : 该文件的名称let suspend = this.fileList.filter(e => {return e.file.name === name;});if (suspend.length != 0) {return suspend[0].needSuspend;}return false;},
*/
/**changeSharding:前端页面定义的可以改变该文件的已经上传分片的事件示例:changeSharding(name, shard) {//传入参数 name:文件的名称  shard:文件已经上传的分片for (let i = 0; i < this.fileList.length; i++) {if (this.fileList[i].file.name === name) {this.fileList[i].sharding = shard;//改变进度条let size = 0;for (let j = 0; j < shard.length; j++) {size += shard[j].Size;}//计算该文件的上传进度this.fileList[i].percentage = ((size / this.fileList[i].file.size) * 100).toFixed(1) - 0;return;}}},
*/

3、cancel

取消一个文件的上传

cancel({ bucket, file })//注意,传入的是一个map
/**bucket:文件上传到s3上的bucket名称
*/
/**file:取消的文件
*/

4、getWorker

判断某个文件是否正在上传,或已经在上传任务中了

使用场景:对文件上传任务点击继续时,判断是否需要将该文件加入到上传任务队列中,因为对该文件的上传 短时间内频繁点击暂停、继续按钮时,可能会导致重复加入同一个文件的上传任务

(只有该任务终止,才应该加入上传队列)

(文件上传分片之前会判断该文件是否已经暂停上传,暂停的话,就会终止任务;或者文件分片上传出错的话,也会终止任务)

getWorker(file)
/**file:文件
*/
返回值:false:没有正在上传   true:正在上传

二、封装的API使用示例

<template><div class="about"><div style="display: flex;justify-content: center;align-items: center;"><el-form label-position="left" label-width="120px" :model="s3Clent" style="width:500px"><el-form-item label="endpoint"><el-input v-model="s3Clent.endpoint"></el-input></el-form-item><el-form-item label="region"><el-input v-model="s3Clent.region"></el-input></el-form-item><el-form-item label="signatureVersion"><el-input v-model="s3Clent.signatureVersion"></el-input></el-form-item><el-form-item label="accessKeyId"><el-input v-model="s3Clent.credentials.accessKeyId"></el-input></el-form-item><el-form-item label="secretAccessKey"><el-input v-model="s3Clent.credentials.secretAccessKey"></el-input></el-form-item></el-form></div><input multiple v-show="false" ref="fileRef" type="file" @change="inputFile"><el-button type="primary" @click="upload()">点击上传文件</el-button><div v-for="f in fileList" :key="f.file.name"><div style="margin-top:50px;display: flex;align-items: center;justify-content: center;" v-if="f.show"><div style="margin-right:20px;font-size:15px;font-weight:60">{{ f.file.name }}</div><el-progress :percentage="f.percentage" style="width:500px"></el-progress><div style="margin-left:20px"><span v-if="f.status == 'err'" style="color:#F56C6C">上传错误</span><span v-else-if="f.status == 'same name'" style="color:#F56C6C">同名文件</span><span v-else-if="f.status == 'success'" style="color:#67C23A">上传成功</span><span v-else-if="f.status == 'suspend'" style="color:#409EFF">已暂停</span></div><div style="margin-left:20px"><!-- 暂停按钮 --><el-button type="primary" icon="el-icon-video-pause" circle v-if="f.status === 'wait'"@click="suspendButton(f)"></el-button><!-- 继续按钮 --><el-button type="primary" icon="el-icon-video-play" circle v-if="f.status === 'suspend'"@click="continuedButton(f)"></el-button><!-- 取消按钮 --><el-button type="danger" icon="el-icon-close" circle v-if="f.status === 'suspend' || f.status === 'err'"@click="cancelButton(f)"></el-button><!-- 重试按钮 --><el-button type="primary" icon="el-icon-refresh-right" circle v-if="f.status === 'err'"@click="continuedButton(f)"></el-button></div></div></div></div>
</template><script>
import { init, cancel, fileChange, getWorker } from '../assets/js/s3.js'
export default {data() {return {fileList: [],//存储上传文件列表s3Clent: {endpoint: "http://minio.3wok.top",region: 'us-east-1',s3ForcePathStyle: true,signatureVersion: 'v4',forcePathStyle: true,credentials: {accessKeyId: 'xxxxxxxxxxx',secretAccessKey: 'xxxxxxx'},}//s3配置文件}},methods: {async continuedButton(file) {file.needSuspend = false;file.status = 'wait';const isInQueue = getWorker(file.file);console.log("isInQueue", isInQueue)if (isInQueue === false) {//如果任务队列中没有这个文件上传任务,那么就加入到任务队列中fileChange({ fileList: [file], bucket: 'test', changeStatus: this.changeStatus, getSuspend: this.getSuspend, changeSharding: this.changeSharding });}},async cancelButton(f) {await cancel({ bucket: 'test', file: f.file });this.fileList = this.fileList.filter(e => {return e.file.name !== f.file.name;});},upload() {this.$refs.fileRef.dispatchEvent(new MouseEvent('click'));},inputFile(event) {let files = event.target.files;let addFile = [];for (let i = 0; i < files.length; i++) {this.fileList.push({percentage: 0,status: 'wait',show: true,file: files[i],needSuspend: false,sharding: [],//分片数组shardSize: 32 * 1024 * 1024//每个分片的大小});addFile.push({percentage: 0,status: 'wait',show: true,file: files[i],needSuspend: false,sharding: [],//分片数组shardSize: 32 * 1024 * 1024//每个分片的大小});}fileChange({ fileList: addFile, bucket: 'test', changeStatus: this.changeStatus, getSuspend: this.getSuspend, changeSharding: this.changeSharding })},//暂停suspendButton(file) {file.needSuspend = true;file.status = 'suspend';},//修改状态changeStatus(name, val) {//TODO 改变进度条for (let i = 0; i < this.fileList.length; i++) {if (this.fileList[i].file.name == name) {this.fileList[i].status = val;if (val === 'success') {this.fileList[i].percentage = 100;}break;}}},//修改分片数组changeSharding(name, shard) {console.log(shard)for (let i = 0; i < this.fileList.length; i++) {if (this.fileList[i].file.name === name) {this.fileList[i].sharding = shard;//改变进度条let size = 0;for (let j = 0; j < shard.length; j++) {size += shard[j].Size;}this.fileList[i].percentage = ((size / this.fileList[i].file.size) * 100).toFixed(1) - 0;return;}}},//获取该文件是否需要暂停getSuspend(name) {let suspend = this.fileList.filter(e => {return e.file.name === name;});if (suspend.length != 0) {return suspend[0].needSuspend;}return false;},},created() {//创建客户端init(this.s3Clent);}
}
</script>

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

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

相关文章

linux下用docker安装mysql

1.mysql Docker镜像 docker pull mysql:[版本号 或 latest]例&#xff1a;docker pull mysql:5.7 2.查看拉取的docker镜像 docker images3.设置 Docker 卷 docker volume create mysql-data列出 Docker 已知的所有卷 docker volume ls4.运行一个 MySQL Docker 容器 docke…

2018年全国硕士研究生入学统一考试管理类专业学位联考写作试题——解析版

2018年1月真题 四、写作&#xff1a;第56~57小题&#xff0c;共65分。其中论证有效性分析30 分&#xff0c;论说文35分。 56.论证有效性分析&#xff1a; 分析下述论证中存在的缺陷和漏洞&#xff0c;选择若干要点&#xff0c;写一篇600字左右的文章&#xff0c;对该论证的有…

乐维监控 | 如何快速关闭网络设备所有端口

在运维监控实践中&#xff0c;由于不同的运维人员可能会关注不同的监控指标&#xff0c;因此乐维监控在监控网络设备时&#xff0c;会默认开启所有的端口&#xff0c;尽可能多的覆盖监控指标&#xff0c;避免遗漏重要指标。但是&#xff0c;这样又会带来新的问题&#xff0c;在…

golang,gin框架的请求参数(一)--推荐

golang&#xff0c;gin框架的请求参数&#xff08;一&#xff09; gin框架的重要性不过多的强调&#xff0c;重点就gin使用中的参数传递&#xff0c;获取进行梳理文件&#xff0c;满足使用需求。 获取前端请求参数的几种方法&#xff1a; 一、获取参数【浏览器地址获取参数】…

【论文阅读】定制化diffusion微调: DreamBooth原理

论文&#xff1a;DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation 项目&#xff1a;DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation 代码&#xff1a;Dreambooth-Stable-Diffusion 1. 任务简…

Kotlin基础(八):泛型

前言 本文主要讲解kotlin泛型&#xff0c;主要包括泛型基础&#xff0c;类型变异&#xff0c;类型投射&#xff0c;星号投射&#xff0c;泛型函数&#xff0c;泛型约束&#xff0c;泛型在Android中的使用。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 泛型基…

Unity XML1——XML基本语法

一、XML 概述 ​ 全称&#xff1a;可拓展标记语言&#xff08;EXtensible Markup Language&#xff09; ​ XML 是国际通用的&#xff0c;它是被设计来用于传输和存储数据的一种文本特殊格式&#xff0c;文件后缀一般为 .xml ​ 我们在游戏中可以把游戏数据按照 XML 的格式标…

JAVA线上问题排查降龙十八掌

现场问题一般有以下几种问题 CPU,磁盘&#xff0c;内存&#xff0c;GC问题&#xff0c;网络 同时例如jstack、jmap等工具也是不囿于一个方面的问题的&#xff0c;基本上出问题就是df、free、top 三连&#xff0c;然后依次jstack、jmap伺候&#xff0c;具体问题具体分析即可。 …

windows中文界面乱码问题

我的便携是内部返修机&#xff0c;买来时就是英文版&#xff0c;在设置中改成简体中文就可以了&#xff0c;与中文版没有什么区别&#xff0c;已经升级成win11。windows自身的应用、360之类的界面都能正常显示&#xff0c;但是个别应用总是乱码&#xff0c;根据客服的提示设置一…

非线性质量弹簧阻尼器的神经网络仿真研究(Matlab代码Simulink仿真实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

关于在虚拟机CentOS7的Docker下安装Oracle

这不三阶段了&#xff0c;要上Oracle了&#xff0c;感觉这个班卷的程度到位。二阶段我就上了ElementUI和MyBatis&#xff0c;项目也是用这些技术写的&#xff0c;整体钻研程度还行。于是布置了两个任务&#xff1a;在windows下安一下Oracle&#xff0c;在windows下安装Oracle那…

python安装第三方包的两种方式

最近研究QQ空间、微博的&#xff08;爬虫&#xff09;模拟登录&#xff0c;发现都涉及RSA算法。于是需要下一个RSA包&#xff08;第三方包&#xff09;。折腾了很久&#xff0c;主要是感觉网上很多文章对具体要在哪里操作写得不清楚。这里做个总结&#xff0c;以免自己哪天又忘…

GRE TAP的工作原理与5G工业物联网中的应用

随着互联网新技术的发展以及智能化水平的提高&#xff0c;各企业对实时数据传输的需求也在不断提升&#xff0c;企业愈发重视数据中心的建设&#xff0c;以保障企业内网数据安全。 GRE&#xff08;Generic Routing Encapsulation&#xff0c;通用路由封装&#xff09;协议属于…

作为一名程序员,IVX你值得拥有

目录 一、IVX是什么 二、IVX编程盒子——低代码平台的首个硬件产品 iVX做硬件的原因 iVX自身特点——安全、方便、高效、低耗 三、IVX编程盒子自带的Demo系统 1. 问题反馈、在线沟通和工单处理系统 2. 大屏幕监管平台 四、IVX和其他代码平台的区别 五、低代码未来的发展…

使用sftp

一、背景 新项目组前端部署方式是Build打包生成dist文件&#xff0c;交由后端部署。后来知道了vscode安装sftp前端可以自行部署。 二、实操 1、vscode安装sftp 2、 配置 ①F1 / ctrlshiftp ②命令行输入sftp -> 选择 sftp: Config ③配置信息介绍 {"name"…

Qt5.14.2+VS2019配置MSVC2017

问题&#xff1a; The compiler " Microsoft Visual C Compiler 16 . 11 . 32106 . 194 ( amd64 x86 )( x86-windows-msvc2019-pe-32bit ) cannot produce code for the Qt version " Qt5.14.2 MSVC2017 64bit " ( x86-windows-msvc2017-pe-64bit 编译器“…

钉钉和金蝶云星空接口打通对接实战

钉钉和金蝶云星空接口打通对接实战 对接系统&#xff1a;钉钉 钉钉是阿里巴巴集团打造的企业级智能移动办公平台&#xff0c;是数字经济时代的企业组织协同办公和应用开发平台。钉钉将IM即时沟通、钉钉文档、钉闪会、钉盘、Teambition、OA审批、智能人事、钉工牌、工作台深度整…

制定机器学习规划路线:从入门到专业

文章目录 &#x1f340;第一阶段&#xff1a;入门基础&#x1f340;了解机器学习概念&#x1f340;学习编程和数学基础&#x1f340;探索经典机器学习算法&#x1f340;完成实践项目 &#x1f340;第二阶段&#xff1a;深入学习&#x1f340; 掌握深度学习基础&#x1f340;学习…

ceph-mon运行原理分析

一、流程&#xff1a;ceph-deploy部署ceph-mon组建集群 1.ceph-deploy部署ceph-mon的工作流程及首次启动 1&#xff09;通过命令创建ceph-mon&#xff0c;命令为&#xff1a;ceph-deploy create mon keyring def mon(args):if args.subcommand create:mon_create(args)elif…

查找-多路查找详解篇

多路查找树 多路查找树&#xff08;Multway Search Tree&#xff09;是一种高级的树形数据结构&#xff0c;它 允许每个节点有多个子节点&#xff08;通常大于等于2&#xff09;。多路查找树的每个节点 可以存储多个关键字和对应的值。分类 2-3树&#xff08;2-3 Tree&#x…