平时在做 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. Microsoft Azure_Fabric
  2. .NET Core 3.0 的新改进:针对分布式应用程序的故障诊断和监控
  3. 构造方法重载 java 1615136407
  4. schedule event mysql_mysql计划任务:event schedule
  5. java的类加载器体系结构和双亲委派机制
  6. ET_01-ET框架开发环境搭建及Demo运行(客户端版)
  7. 关于程序员的调查报告
  8. python按什么键停止运行_python如何停止运行
  9. Badboy 录制脚本提示“当前页面的脚本发生错误”解决
  10. 小提琴1234567位置图解_1秒找到小提琴上的每个调音阶
  11. Stata:因子变量全攻略-双向固定效应-超越对数生产函数
  12. android 广播的权限,拒绝权限:不允许发送广播android.intent.acti...
  13. SQL中的DML、DDL以及DCL是什么?
  14. Python - io 模块
  15. NLP入门(八)使用CRF++实现命名实体识别(NER)
  16. Assertion断言入门(四)——断言覆盖率
  17. elasticsearch _cat命令详解
  18. 【莫问前路】数据结构篇 绪论
  19. 使用Qt框架创建一个基于Qt Quick的Python应用
  20. ds服务器没检测到有响应,设备或资源dns没检测到有响应 网络无法连接

热门文章

  1. 计算机网络-数据链路层1
  2. websphere mq_使用WebSphere MQ应用程序活动跟踪提高消息的可见性
  3. BeautifulSoup爬取贝壳网成都二手房源信息(附:完整源代码)
  4. 这个时代——“寒门再难出贵子”,也许不服,不干,但想改变好比石头砸天(转自天涯)...
  5. shell中的流编辑器awk
  6. UVALive 5739|User Names|模拟
  7. 【Java】2022年团体程序设计天梯赛 L1 和 L2-042 题解
  8. 遥感数据处理流程新概念(一) ——RSD的面向任务
  9. LinuxC++:网络编程(一)最原始服务端及客户端代码实现和函数释义
  10. S3C2410驱动分析之LCD驱动