阿里云 oss多文件上传
平时在做 oss 上传时,通过都是单个文件上传,但是前几天工作时涉及到多个文件的上传,在所有文件都上传完成后才能再做后续的代码执行。于是在原有的oss上传基础上添加for循环去挨个上传。
介绍一下,oss 的上传可以有两种:
- 一种是把所有的文件上传给后端,由后端去传到阿里云oss上,这样不涉及到向后端获取accessKeyId 和bucket等,没有key泄露的风险(适用于C端客户)。
- 一种是向后端调接口获取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>
- 该引入的插件和文件
<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多文件上传相关推荐
- 使用阿里云OSS实现文件上传
概述场景 文件上传,是程序开发中必须会使用到的一个功能,比如: 添加商品,用户头像,文章封面等需求 富文本编辑(插件文件上传) 文件上传的原理是什么? 我们为什么要实现文件上传,其实就要共享资源,大家 ...
- 阿里云 oss服务器文件上传 java
前天做oss服务器文件上传,之前没了解过,做的过程中遇到许多问题,最终通过查阅相关资料解决了,特分享一下. 首先准备工作 必要的jar 这里注意版本一致,不然就会报很多坑爹的错误.. 如果你断点调试在 ...
- SpringBoot 系列教程(九十九):SpringBoot整合阿里云OSS实现文件上传,下载,删除功能
一.前言 之所以写这篇文章呢? 是因为最近在做文件上传时遇到一个问题,就是我们在以前使用传统Spring+SpringMVC+Mybatis框架开发Web项目的时候,都是将项目打包生成一个War包,然 ...
- Spring boot上传文件(图片)到阿里云OSS(直接上传到应用服务器)
Spring boot上传文件(图片)到阿里云OSS(直接上传到应用服务器) 主要思路 上传图片的思路有两种: 第一种是上传到应用服务器,再由应用服务器上传到OSS.这种适合上传的文件较小,较为简单, ...
- 阿里云 OSS SDK :上传的图片直接访问变成下载问题解决
文章目录 阿里云 OSS SDK :上传的图片直接访问变成下载问题解决 1.产生原因 2.解决方案 阿里云 OSS SDK :上传的图片直接访问变成下载问题解决 1.产生原因 上传的文件,未指定文件访 ...
- 使用阿里云OSS实现图片上传案例
文章目录 前言 一.OSS是什么? 二.使用步骤 1.开通OSS服务 2.创建bucket 3.创建子账户 4.查看帮助文档,编写后端代码 5.layui前端 总结 前言 在正式的开发环境中,类似图片 ...
- vue plupload 的使用, 阿里云OSS PHP 安全上传
1. 首选npm安装plupload 2. 阿里云OSS PHP 安全上传 <template> <div class="imgUpload"> ...
- 阿里云oss简单的上传下载删除(java)
阿里云oss上传和下载. 配置maven <!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss --> ...
- **关于阿里云oss图片批量上传问题解析**
关于阿里云oss图片批量上传问题解析 背景 最近在项目开发过程中遇到的问题,消耗了比较久的时间,过程曲折,虽然最终达到目的,但是鉴于各种常用的云数据在对象存储方面大同小异,所以记录一下. 理一下思路: ...
最新文章
- Microsoft Azure_Fabric
- .NET Core 3.0 的新改进:针对分布式应用程序的故障诊断和监控
- 构造方法重载 java 1615136407
- schedule event mysql_mysql计划任务:event schedule
- java的类加载器体系结构和双亲委派机制
- ET_01-ET框架开发环境搭建及Demo运行(客户端版)
- 关于程序员的调查报告
- python按什么键停止运行_python如何停止运行
- Badboy 录制脚本提示“当前页面的脚本发生错误”解决
- 小提琴1234567位置图解_1秒找到小提琴上的每个调音阶
- Stata:因子变量全攻略-双向固定效应-超越对数生产函数
- android 广播的权限,拒绝权限:不允许发送广播android.intent.acti...
- SQL中的DML、DDL以及DCL是什么?
- Python - io 模块
- NLP入门(八)使用CRF++实现命名实体识别(NER)
- Assertion断言入门(四)——断言覆盖率
- elasticsearch _cat命令详解
- 【莫问前路】数据结构篇 绪论
- 使用Qt框架创建一个基于Qt Quick的Python应用
- ds服务器没检测到有响应,设备或资源dns没检测到有响应 网络无法连接
热门文章
- 计算机网络-数据链路层1
- websphere mq_使用WebSphere MQ应用程序活动跟踪提高消息的可见性
- BeautifulSoup爬取贝壳网成都二手房源信息(附:完整源代码)
- 这个时代——“寒门再难出贵子”,也许不服,不干,但想改变好比石头砸天(转自天涯)...
- shell中的流编辑器awk
- UVALive 5739|User Names|模拟
- 【Java】2022年团体程序设计天梯赛 L1 和 L2-042 题解
- 遥感数据处理流程新概念(一) ——RSD的面向任务
- LinuxC++:网络编程(一)最原始服务端及客户端代码实现和函数释义
- S3C2410驱动分析之LCD驱动