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

2023-11-06

地址

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

效果

直接运行vue-example文件就行
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

easy-s3

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

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

使用方法:下载s3.js文件和spark-md5.min.js文件(放同一文件夹),并将s3.js引入到需要使用的页面或js文件,即可使用
具体使用示例可参照下文中的第二点

前提:依赖下载

因为该js文件是封装的s3的api,所以要提前下载s3的sdk
不同框架下载的sdk可能不同,可以修改s3.js的sdk的引入方式

下载aws-sdk依赖

vue

npm install @aws-sdk/client-s3

其他框架可自行查找资料,下载

API

1、init

传入以下参数,初始化s3客户端 注意:传入的是一个map

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-azD45eoR-1691119636498)(https://github.com/gk-1213/easy-s3/assets/76909981/fd43ddef-b6e3-487e-8c13-199c82780e79)]

2、fileChange

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

传入参数:

fileChange({ fileList, bucket, changeStatus, getSuspend, changeSharding } )   //注意,传入的是一个map

/**
	fileList:文件信息数组,其内部元素的结构为
	{
                key:"",//文件对象名,一般为文件的名称,也可根据需求自定义  true
		file: file,//需要上传的文件   true
		sharding: [],//分片数组,该文件已经上传了那些分片  true
		shardSize: 32 * 1024 * 1024//该文件每个分片的大小   true
	}
*/

/**
	bucket:文件上传到s3上的bucket名称
*/

/**
	changeStatus:一个事件,前端页面定义的可以改变文件上传的状态的事件
	示例:
	changeStatus(key, val) {//传入参数 key:文件对象名称   val:文件状态
            for (let i = 0; i < this.fileList.length; i++) {
                if (this.fileList[i].file.key == key) {
                    this.fileList[i].status = val;
                    if (val === 'success') {
                        this.fileList[i].percentage = 100;
                    }
                    break;
                }
            }
        },

*/


/**
	getSuspend:一个事件,前端页面定义的可以获取该文件上传是否暂停的事件
	示例:
	getSuspend(key) {//传入参数 key : 该文件的名称
            let suspend = this.fileList.filter(e => {
                return e.file.key === key;
            });
            if (suspend.length != 0) {
                return suspend[0].needSuspend;
            }
            return false;
     },
*/
/**
	changeSharding:前端页面定义的可以改变该文件的已经上传分片的事件
	示例:
	changeSharding(key, shard) {//传入参数 key:文件的名称  shard:文件已经上传的分片
            for (let i = 0; i < this.fileList.length; i++) {
                if (this.fileList[i].file.key === key) {
                    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, f })//注意,传入的是一个map
/**
	bucket:文件上传到s3上的bucket名称
*/
/**
	f:取消的文件信息对象,对象结构为
	{
                key:"",//文件对象名,一般为文件的名称,也可根据需求自定义  true
		file: file,//需要上传的文件   true
		sharding: [],//分片数组,该文件已经上传了那些分片  true
		shardSize: 32 * 1024 * 1024//该文件每个分片的大小   true
	}
*/
返回值  false:取消失败  true:文件上传事件取消成功
4、getWorker

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

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

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

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

getWorker(key)
/**
 key:文件对象名
*/
返回值: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.key">
            <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.key }}
                </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 key'" 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.key !== f.key;
            });
        },
        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(key, val) {
            for (let i = 0; i < this.fileList.length; i++) {
                if (this.fileList[i].key == key) {
                    this.fileList[i].status = val;
                    if (val === 'success') {
                        this.fileList[i].percentage = 100;
                    }
                    break;
                }
            }
        },
        //修改分片数组
        changeSharding(key, shard) {
            console.log(shard)
            for (let i = 0; i < this.fileList.length; i++) {
                if (this.fileList[i].key === key) {
                    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(key) {
            let suspend = this.fileList.filter(e => {
                return e.key === key;
            });
            if (suspend.length != 0) {
                return suspend[0].needSuspend;
            }
            return false;
        },

    },
    created() {
        //创建客户端
        init(this.s3Clent);
    }
}
</script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Vue项目运行报错:Cannot read properties of undefined (reading ‘install‘)

    在做vue2项目时出现如下错误 页面空白且控制台出现如下错误 报错原因 vue router安装的版本太高 一般vue2的项目对应的版本是vue router 3版本 解决办法 在控制台输入 cnpm install save vue ro
  • Open3D中RANSAC平面拟合

    文章目录 一 函数介绍 二 代码实现 三 结果展示 四 总结 五 坐标中心化 一 函数介绍 使用RANSAC从点云中分割平面 用segement plane函数 这个函数需要三个参数 destance threshold 定义了一个点到一个
  • eager模式和graph模式 Tensorflow

    Tensorflow2在原有graph模式基础上引入了eager模式 graph是tensorflow v1的图模式 eager是立即执行运算模型 Tensorflow2的eager模式和graph模式 1 哔哩哔哩 bilibili 不需
  • Python手册(IDE)--Jupyter Notebook

    文章目录 Anaconda Jupyter Notebook 快捷键 魔术命令 Anaconda Anaconda 是一个用于科学计算的 Python 发行版 支持 Linux Mac Windows 包含了众多流行的科学计算 数据分析的
  • 安全配置

    基线管理之centos安全配置 1 检查不用的链接 ip link show up 如果有需要关闭的接口 可以使用 ip link set down 2 关闭IP转发 先查看ip转发配置 sysctl net ipv4 ip forward
  • 求两条轨迹间的hausdorff距离_轨迹规划之位置插补

    假设我们有一个向量的序列 如果我们想对这个序列进行插值 那么 我们可以分别对每一对向量 和 进行插值 然后将插值的曲线连接起来 也就 是我们所说的样条 Spline 很明显 这个曲线虽然是连续的 但是它的一阶导数 切线 在切换插值向量时都不
  • 矩母函数和生成函数

    关于矩母函数和生成函数 今天来说道说道 系本人自身学习理解 不对之处 还望各位看官海涵 首先 这是两个名字 二者不是一个东西 这是首先需要搞清楚的 但是二者的定义却有着相同的目的即 求若干独立随机变量和的分布 1 矩母函数 仅连续型随机变量
  • 基于Python+Pyecharts+爬虫实现的对全球疫情新增患者可视化分析

    文章目录 前言 1 爬取网站获取全球各国新冠新增人数 1 1挑选网站进行网页源码分析 1 2对该网站采用requests库进行网络爬取 1 3将返回的字典添加到刚才所建立的空列表当中 2 对所得数据进行可视化分析 2 1采用pyechart
  • Grafana

    为什么80 的码农都做不了架构师 gt gt gt 最近在调研InfluxDB的时候接触到了Grafana Grafana是什么 一个类似Kibana的东西 也是对后端的数据进行实时展示 那么Grafana和Kibana有什么区别 在我看来
  • tp5中树状图数据格式的返回

    1 条件 数据库中的数据必须是无限递归数据 2 数据处理 public function treeListApi list this gt db class gt field id name parent id gt where is de
  • str功能的实现

    1 strcat 功能 把src所指字符串添加到dest结尾处 覆盖dest结尾处的 0 并添加 0 程序 char strcat char dest const char src char addr dest int i 0 j 0 as
  • 私服的搭建

    私服 基于nexus 3 20 1 下载地址 https help sonatype com repomanager3 download 目前该下载地址国内下载根本下载不了 你可以去百度找找看 分享一个百度网盘下载链接 链接 https p
  • Oracle 索引

    1 索引介绍 索引是用于加速数据存取的数据对象 是对数据表中一个或多个列进行排序的结构 合理的使用索引可以大大降低I O次数 从而提高数据访问性能 2 问题 为什么需要索引 Select from scott emp where empno
  • python(五)函数、模块、包

    模块 包的概念 在Python中 一个 py文件就称之为一个模块 Module 我们在编写程序的时候 也经常引用其他模块 包括Python内置的模块和来自第三方的模块 你也许还想到 如果不同的人编写的模块名相同怎么办 为了避免模块名冲突 P
  • oracle多个表count值求和

    union和union all关键字都是将两个结果集合并为一个 但这两者从使用和效率上来说都有所不同 union在进行表链接后会筛选掉重复的记录 所以在表链接后会对所产生的结果集进行排序运算 删除重复的记录再返回结果 而union all只
  • docker安装fastDFS

    一 docker安装 1 搜索镜像 2 拉取镜像 最新版本 docker pull delron fastdfs 3 使用镜像构建容器 3 1 创建tracker容器 docker run dti network host name my
  • js-yaml简单使用

    安装 js yaml npm install js yaml index js let fs require fs let content fs readFileSync text yaml encoding utf8 let yaml r
  • img加载图片的三种方式

    方式一 src指向图像的位置 最常用的一种方式 无需搭配后端代码 img src img boat gif alt Big Boat 方式二 src执行后台路径 获取图片的字节数组 前端代码 img src getImage alt Big
  • ubuntu20.04网络配置

    安装net tools sudo apt get install net tools 2 ifconfig查看网卡设备 其中flags表中 running表示正在使用中 查看设备核心网络路由表 route n Destination 目标网
  • 将AWS S3大文件文件上传相关的API集成为js文件,功能包括 多文件并行上传、文件分片上传、断点续传、文件分片合成、上传暂停、取消上传、文件上传进度条显示

    地址 https github com gk 1213 easy s3 tree main 效果 直接运行vue example文件就行 easy s3 将AWS S3大文件文件上传相关的API集成为js文件 功能包括多文件并行上传 文件分