平时在做 oss 上传时,通过都是单个文件上传,但是前几天工作时涉及到多个文件的上传,在所有文件都上传完成后才能再做后续的代码执行。于是在原有的oss上传基础上添加for循环去挨个上传。
介绍一下,oss 的上传可以有两种:

  1. 一种是把所有的文件上传给后端,由后端去传到阿里云oss上,这样不涉及到向后端获取accessKeyId 和bucket等,没有key泄露的风险(适用于C端客户)。
  2. 一种是向后端调接口获取key等数据,存储在本地,需要的时候调用就可以了,key值设置失效时间,一段时间过后,再向后端获取新的key值,减少key泄露(适用于B端客户)。

第一种,我们就不过多介绍了,就平常的调用上传接口,这篇文章主要介绍第二种
所用到的框架:vue + typescript + element-ui +ali-oss
效果:

<!--
on-preview :点击文件列表中已上传的文件时的钩子
on-remove :文件列表移除文件时的钩子
on-change: 文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用
disabled: 是否可上传、添加、删除等
-->
<el-row class="toolbar"><el-uploadaction="#":auto-upload="false"list-type="picture-card"ref="modelFormId":on-preview="handlePictureCardPreview":on-remove="handleRemove":on-change="onChangeFileValid":disabled="isLook"><i class="el-icon-plus"></i></el-upload><el-dialog :visible.sync="dialogVisible"><img width="100%" :src="dialogImageUrl" alt="" /></el-dialog><el-button @click='upload'>开始上传</el-button></el-row>
  1. 该引入的插件和文件
<script lang="ts">
import Vue from "vue";
import { Component, Prop, Watch } from "vue-property-decorator"; // typescript导入组件装饰器
// 自己写的生成的36位文件名称id标识
import { Common } from "@/assets/js/common";
// 安装 ali-oss 这也是文件上传阿里云时需要用到的
import OSS from "ali-oss";
// 向后端获取oss key的接口
import { getPublicUpOssSTS } from "@/api/download";
@Component({})
export default class Upload extends Vue {ossComPath: string = "ictr-tb-commonservice-test"; // 上传文件时文件所在的文件夹地址dialogImageUrl: string = ""; // el-upload 放大文件时的url地址dialogVisible: boolean = false; // el-upload 是否正在预览文件common: any = new Common(); // new 一下commonpathName: string = ""; // 上传文件的idisLoaderVisible: boolean = false; // 上传文件时的标识fullscreenLoading: boolean = false; // 正在上传file: any = undefined; ossClient: any = {region: "oss-cn-beijing",accessKeyId: "",accessKeySecret: "",bucket: "",stsToken: ""};fileList: any[] = [];
// 点击开始上传按钮upload() {const loading = this.$loading({lock: true,text: "Loading",spinner: "el-icon-loading",background: "rgba(0, 0, 0, 0.7)"});this.isLoaderVisible = true;// 判断签名是否过期,如果过期再次向后端获取签名,也就是keythis.setUploadParam().then(async status => {loading.close();if (status === 200) {// 开始调用上传方法this.multipartUpload();}},req => {loading.close();});}// 真正开始上传async multipartUpload(param) {if (this.fileList.length !== 0) {this.client = new OSS(this.ossClient);let storeAsList: any[] = [];//遍历要上传的文件,设置文件唯一名称this.fileList.forEach((m, index: number) => {// 自定义id键和自定义名称 const name = this.common.guid() + this.common.getFileExtendingName(param.name);storeAsList.push({storeAs: "adcp/DefaultFilePath/fileAnalysisTempSource/" + name,m});});// 等待全部上传成功await Promise.all(storeAsList.map((file, i) => {return this.multiBackPath(file.storeAs, file.m);}));//此时已经全部上传成功了this.$message.success("所有文件上传成功!");}}multiBackPath(storeAs, param) {return new Promise((resolve, reject) => {this.client.multipartUpload(storeAs, param.raw).then(result => {resolve(result);}).catch(err => {if (!this.client.isCancel()) {this.isLoaderVisible = false;this.$message.warning("上传失败-");reject();}});});}
文件上传之前判断签名是否过期setUploadParam() {// 判断本地是否有已存在osslet ossData = JSON.parse(localStorage.getItem("ossdata") as any);return new Promise((resolve, reject) => {if (ossData !== null && new Date(ossData.Expiration) > new Date()) {this.ossClient.accessKeyId = ossData.AccessKeyId;this.ossClient.accessKeySecret = ossData.AccessKeySecret;this.ossClient.stsToken = ossData.SecurityToken;this.ossClient.bucket = this.ossComPath;resolve(200);} else {// 如果本地oss key已过期,再向后端获取getPublicUpOssSTS().then((res: any) => {let json = JSON.parse(JSON.stringify(res.data));this.ossClient.accessKeyId = json.AccessKeyId;this.ossClient.accessKeySecret = json.AccessKeySecret;this.ossClient.stsToken = json.SecurityToken;this.ossClient.bucket = this.ossComPath;localStorage.setItem("ossdata", JSON.stringify(json));resolve(200);},() => {reject(400);});}});}// 文件成功添加在el-upload时触发的钩子onChangeFileValid(file) {let xls = file.name.split(".").pop();if (["jpg", "png"].includes(xls)) {// 每添加一个文件,就push到 fileList集合中this.fileList.push(file);} else {(this.$refs.modelFormId as any).clearFiles();this.$message.error("文件只能上传.jpg或.png的文件!");}return false;}//
// 删除上传的文件handleRemove(file, fileList) {this.fileList = fileList;}handlePictureCardPreview(file) {this.dialogImageUrl = file.url;this.dialogVisible = true;}
}
</script>

阿里云 oss多文件上传相关推荐

  1. 使用阿里云OSS实现文件上传

    概述场景 文件上传,是程序开发中必须会使用到的一个功能,比如: 添加商品,用户头像,文章封面等需求 富文本编辑(插件文件上传) 文件上传的原理是什么? 我们为什么要实现文件上传,其实就要共享资源,大家 ...

  2. 阿里云 oss服务器文件上传 java

    前天做oss服务器文件上传,之前没了解过,做的过程中遇到许多问题,最终通过查阅相关资料解决了,特分享一下. 首先准备工作 必要的jar 这里注意版本一致,不然就会报很多坑爹的错误.. 如果你断点调试在 ...

  3. SpringBoot 系列教程(九十九):SpringBoot整合阿里云OSS实现文件上传,下载,删除功能

    一.前言 之所以写这篇文章呢? 是因为最近在做文件上传时遇到一个问题,就是我们在以前使用传统Spring+SpringMVC+Mybatis框架开发Web项目的时候,都是将项目打包生成一个War包,然 ...

  4. Spring boot上传文件(图片)到阿里云OSS(直接上传到应用服务器)

    Spring boot上传文件(图片)到阿里云OSS(直接上传到应用服务器) 主要思路 上传图片的思路有两种: 第一种是上传到应用服务器,再由应用服务器上传到OSS.这种适合上传的文件较小,较为简单, ...

  5. 阿里云 OSS SDK :上传的图片直接访问变成下载问题解决

    文章目录 阿里云 OSS SDK :上传的图片直接访问变成下载问题解决 1.产生原因 2.解决方案 阿里云 OSS SDK :上传的图片直接访问变成下载问题解决 1.产生原因 上传的文件,未指定文件访 ...

  6. 使用阿里云OSS实现图片上传案例

    文章目录 前言 一.OSS是什么? 二.使用步骤 1.开通OSS服务 2.创建bucket 3.创建子账户 4.查看帮助文档,编写后端代码 5.layui前端 总结 前言 在正式的开发环境中,类似图片 ...

  7. vue plupload 的使用, 阿里云OSS PHP 安全上传

    1.  首选npm安装plupload 2. 阿里云OSS PHP 安全上传 <template>   <div class="imgUpload">   ...

  8. 阿里云oss简单的上传下载删除(java)

    阿里云oss上传和下载. 配置maven <!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss --> ...

  9. **关于阿里云oss图片批量上传问题解析**

    关于阿里云oss图片批量上传问题解析 背景 最近在项目开发过程中遇到的问题,消耗了比较久的时间,过程曲折,虽然最终达到目的,但是鉴于各种常用的云数据在对象存储方面大同小异,所以记录一下. 理一下思路: ...

最新文章

  1. python【力扣LeetCode算法题库】70-爬楼梯
  2. [HOW TO]-从github拉取optee代码拉不下来怎么办?
  3. LUA 删除元素的问题
  4. java中索引超出怎么办_Java-字符串索引超出范围异常“字符串索引超出范围”
  5. C++自定义直方图均衡化
  6. Hammer.js移动端触屏框架的使用
  7. 经典面试题(24):以下代码将输出的结果是什么?
  8. 强烈推荐!FlyAI机器学习数据竞赛启动,丰厚奖金等你来拿
  9. SSH中设置字符编码防止乱码
  10. Linux命令-文件处理命令:touch
  11. JZ32 从上往下打印二叉树
  12. C#之网络字节序与主机字节序互转
  13. 【基础】深度学习最常用的10个激活函数!(数学原理+优缺点)
  14. pdn阻抗测试_非常详细的阻抗测试基础知识
  15. 【云原生Docker系列第二篇】Docker容器管理(我在人间贩卖黄昏,只为带着星光照耀你)
  16. Dao层和Service层的区别
  17. jadx学习记录01
  18. Linux系统程序包管理工具-RPM
  19. C++多继承中的二义性问题
  20. Windows SUS

热门文章

  1. 美国医院管理历程,学而时习之
  2. 程序员面试宝典笔记1-基本概念预处理,const与sizeof
  3. Python---第6天:数据处理的瑞士军刀pandas下篇
  4. Linux_shell——第5章 一团乱麻?没这回事
  5. WRF中使用ERA5再分析数据
  6. 战队口号霸气押韵8字_霸气销售团队激励口号押韵
  7. 大数据三篇论文—Google Bigtable中文版
  8. 【实习面经】一口气面完了字节、陌陌、云从,我发现面试官原来是这样问问题的?
  9. 年末的大厂前端面试总结(20届双非二本)-终入字节
  10. Nginx 部署 静态资源路径问题