将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,一经查实,立即删除!

相关文章

【业务功能篇54】Springboot项目常用工具类:HTTP状态码/客户端request

状态码常量类 /*** 返回状态码**/ public class HttpStatus {/*** 操作成功*/public static final int SUCCESS 200;/*** 对象创建成功*/public static final int CREATED 201;/*** 请求已经被接受*/public static final int ACCEPTED 202;/*** 操作已经执行成功&#xff0…

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;对该论证的有…

【docker 安装】 与【docker-compose 安装】

不同的操作系统需要不同的docker安装文件&#xff1a;具体下载位置&#xff1a; Docker: https://download.docker.com/linux/static/stable/ docekr-compose&#xff1a;https://github.com/docker/compose/releases 1. 验证客户机器是否有docker 和docker-compose docker -…

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

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

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

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

微信小程序开发设置获取权限管理,摄像头权限,位置权限,用户信息权限等

在小程序开发的时候&#xff0c;我们总会遇到很多权限问题&#xff0c;比如摄像头权限,位置权限,用户信息权限等&#xff0c;如果不加以判断&#xff0c;很难给用户一个好的体验。 有一天&#xff0c;小明来参观一个拍照微信小程序。 他很感兴趣&#xff0c;看着精美的页面&am…

【论文阅读】定制化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 的格式标…

istio 常见问题排查

配置校验 istioctl validate istioctl validate 可用于校验 istio 配置文件规则&#xff0c;即&#xff1a;验证YAML文件。 istioctl analyze istioctl analyze 可用于检查istio配置潜在的问题。 如&#xff0c;校验某命名空间下资源配置&#xff1a; $ istioctl analyze…

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;以免自己哪天又忘…

element el-transfer组件实现右侧列表可拖拉拽效果

需求是实现Transfer 穿梭框选中的数据列表&#xff0c;可以拖拉拽进行排序功能。 主要是使用到了sortablejs插件。 首先安装sortablejs npm install sortablejs --save再使用的vue文件中引用插件 <el-transfer ref"transfer" v-model"form" :data&qu…

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"…