如何基于 vue3+el-upload 二次封装上传文件组件到阿里云 oss(附上传进度条)

news/2024/10/23 5:43:01/

如何基于 vue3+el-upload 二次封装上传文件组件到阿里云 oss 附进度条

  • 一、创建生成全局唯一标识符 方法
  • 二、导入计算文件Md5(spark-md5)
  • 三、安装依赖ali-oss
  • 四、创建导出ali-oss 方法
  • 五、创建上传文件 组件(完整代码)
  • 六、引入使用组件

一、创建生成全局唯一标识符 方法

  • 在utils文件夹下 创建guid.ts
// 生成GUID
export function newGuid() {function S4() {return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)}return S4() + S4() + S4() + S4() + S4() + S4() + S4() + S4()
}

二、导入计算文件Md5(spark-md5)

npm i spark-md5

三、安装依赖ali-oss

npm i ali-oss

四、创建导出ali-oss 方法

  • 在utils文件夹下 创建alioss.ts,并接收所需要的阿里云oss地区、id、密钥、远程仓库名称
import OSS from 'ali-oss'
export function client<T>(accessKeyId: T, accessKeySecret: T) {
//接收过来阿里云id和密钥console.log('接收到的', accessKeyId, accessKeySecret)var clients = new OSS({region: 'oss-cn-beijing', //地区(填写你自己的阿里云oss地区)accessKeyId, //阿里云oss idsecure: true,accessKeySecret, //阿里云oss 密钥bucket: 'cangku', //远程仓库名称 (填写你自己的阿里云仓库)}) return clients
}

五、创建上传文件 组件(完整代码)

  • 创建封装上传文件组件 (代码中需填写阿里云oss的id和密钥)
<template><div><el-progressv-if="showPercentage"style="margin-bottom: 15px":text-inside="true":stroke-width="20":percentage="percentage"stripedstriped-flow/><el-uploadclass="upload-demo":drag="drag":limit="limit":disabled="disabled":auto-upload="autoUpload":accept="accept":show-file-list="showFileList":action="action":multiple="multiple":http-request="httpRequest":before-upload="beforeUpload":on-progress="uploadFileProcess":on-success="handleAvatarSuccess":on-remove="handleRemove":on-exceed="handleExceed":on-change="handleChange"><!-- 拖拽上传 --><div v-if="drag"><el-icon class="el-icon--upload"><upload-filled /></el-icon><div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div></div><!-- 手动上传 --><div v-else><el-button type="primary">点我上传</el-button></div></el-upload></div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { UploadFilled } from '@element-plus/icons-vue'
import SparkMD5 from 'spark-md5'
import { newGuid } from '@/utils/guid'
import { client } from '@/utils/alioss'
import { ElMessage } from 'element-plus'
import type { UploadProps } from 'element-plus'
//是否显示上传进度条
const showPercentage = ref(false)
//上传进度
const percentage = ref(0)const props = defineProps({// 请求urlaction: {type: String,},//是否支持多选文件multiple: {type: Boolean,default: () => false,},//是否显示已上传文件列表showFileList: {type: Boolean,default: () => true,},//是否启用拖拽上传drag: {type: Boolean,default: () => true,},//接收的上传类型accept: {type: String,},//允许上传文件的最大数量limit: {type: Number,},//是否禁用上传disabled: {type: Boolean,default: () => false,},//是否自动上传文件autoUpload: {type: Boolean,default: () => true,},
})//获取文件的Mds
const getFileMd5 = (file: any) => {return new Promise((resolve, reject) => {const spark = new SparkMD5.ArrayBuffer()console.log('spark', spark)const fileReader = new FileReader()console.log('fileReader', fileReader)fileReader.onload = (e: any) => {console.log('打印e', e)spark.append(e.target.result)resolve(spark.end())}fileReader.onerror = () => {reject('')}fileReader.readAsArrayBuffer(file.file)})
}//获取文件后缀名
const getExtension = (file: File) => {if (file) {// 通过正则表达式提取文件后缀名const regex = /(?:\.([^.]+))?$/const result = regex.exec(file.name)return result?.[1] || null}return null // 处理输入为 null 的情况
}//自定义上传文件
const httpRequest = async (file: any) => {ElMessage({message: '开始上传,请等待!',type: 'warning',})showPercentage.value = trueconsole.log('自定义上传了文件', file)//生成文件md5const fileMd5 = await getFileMd5(file)console.log('打印文件的md5', fileMd5)//生成guidconst fileGuid = newGuid()console.log('打印生成的文件名称', fileGuid)//获取上传文件的后缀const fileSuffix = getExtension(file.file)console.log('打印获取的文件后缀', fileSuffix)//生成新文件名const newFileName = fileGuid + '.' + fileSuffixconsole.log('生成新文件名', newFileName)let AccessKeyId = 'xxxx'  //填写你的阿里云oss idlet AccessKeySecret = 'xxxx' //填写你的阿里云oss 密钥let res = await client(AccessKeyId, AccessKeySecret).multipartUpload(newFileName,file.file,{progress,parallel: 4, //同时上传数量partSize: 1024 * 1024 * 1, //设置分片大小timeout: 120000, //设置超时时间})console.log('打印上传的结果', res)if (res.res.statusCode === 200) {ElMessage({message: '上传成功!',type: 'success',})} else {file.onError('上传失败')}
}
//上传进度
const progress = (progress: any, checkpoint: any) => {// Object的上传进度。console.log('上传进度', progress)percentage.value = progress.toFixed(2) * 100// 分片上传的断点信息。console.log('分片上传的断点信息', checkpoint)
}
//上传文件之前的钩子函数
const beforeUpload: UploadProps['beforeUpload'] = (file) => {console.log('上传文件之前的钩子函数', file)
}//文件上传时的钩子函数
const uploadFileProcess: UploadProps['onProgress'] = () => {console.log('文件上传时的钩子函数')
}//文件上传成功时的钩子
const handleAvatarSuccess: UploadProps['onSuccess'] = (response,uploadFile
) => {console.log('文件上传成功时的钩子')setTimeout(() => {showPercentage.value = falsepercentage.value = 0}, 300)
}// 文件列表移除文件时的钩子
const handleRemove: UploadProps['onRemove'] = (file, uploadFiles) => {console.log('文件列表移除文件时的钩子')
}//当超出限制时,执行的钩子函数
const handleExceed: UploadProps['onExceed'] = () => {console.log('超出限制时,执行的钩子函数')
}//文件状态改变时的钩子函数
const handleChange: UploadProps['onChange'] = () => {console.log('文件状态改变时的钩子函数')
}
</script><style scoped lang="scss"></style>

六、引入使用组件

  • 引入组件
const UploadFile = defineAsyncComponent(() => import('@/components/uploadFile/index.vue')
)
  • 使用组件
<UploadFile></UploadFile>

http://www.ppmy.cn/news/1191679.html

相关文章

Matplotlib教程(非常详细)(第二部分)

接着上一部分Matplotlib教程&#xff08;非常详细&#xff09;&#xff08;第一部分&#xff09;接着描述。 十七、Matplotlib双轴图 在一些应用场景中&#xff0c;有时需要绘制两个 x 轴或两个 y 轴&#xff0c;这样可以更直观地显现图像&#xff0c;从而获取更有效的数据。…

PHP短网址短链接生成源码/长链接在线缩短源码/支持黑夜模式

源码简介&#xff1a; PHP短网址短链接生成源码&#xff0c;长链接在线缩短源码&#xff0c;它支持黑夜模式&#xff0c;反应灵敏的设计&#xff0c;优雅简洁的界面&#xff0c;大方简约。PHP源码&#xff0c;强大的短网址生成源码。 简洁、优雅、反应灵敏的设计。创建URL、创…

【小黑嵌入式系统第七课】PSoC® 5LP 开发套件(CY8CKIT-050B )——PSoC® 5LP主芯片、I/O系统、GPIO控制LED流水灯的实现

上一课&#xff1a; 【小黑嵌入式系统第六课】嵌入式系统软件设计基础——C语言简述、程序涉及规范、多任务程序设计、状态机建模(FSM)、模块化设计、事件触发、时间触发 文章目录 一、PSoC 5LP主芯片二、PSoC 5LP I/O系统(1) I/O系统特性(2) I/O系统怎样运作&#xff1f;1、I/…

ES-初识ES

文章目录 介绍ElasticSearchElasticSearch的主要功能ElasticSearch的主要特性ElasticSearch的家族成员LogStashKibanaBeats ELK&#xff08;ElasticSearch LogStash Kibana&#xff09;的应用场景与数据库集成指标采集/日志分析 安装和配置ElasticSearch一、安装1、下载ES安装…

【计算机网络笔记】传输层——可靠数据传输之流水线机制与滑动窗口协议

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

在本地模拟C/S,Socket套接字的使用

public class SocketTCP01Server {public static void main(String[] args) throws IOException {/**1.在本机的 9999 端口监听 &#xff0c;等待连接细节&#xff1a; 要求在本机没有其他服务在监听999细节&#xff1a;这个ServerSocket 可以通过accept()返回多个Socket[多个客…

新版开源UI千月影视APP源码/后端基于ThinkPHP框架/前后端完美匹配

源码简介&#xff1a; 开源UI千月影视APP源码&#xff0c;它是基于ThinkPHP框架&#xff0c;而且前后端完美匹配。这是一个广泛使用的PHP开发框架&#xff0c;具有稳定性和安全性方面的优势。 2023版本UI千月影视APP是一款提供电影、电视剧、综艺节目等视频内容的应用程序&am…

某汽车金融企业:搭建SDLC安全体系,打造智慧金融服务样本

某汽车金融企业是国内头部汽车金融公司&#xff0c;已经为超过数百万名客户提供专业的汽车金融服务。该公司通过近几年的数字化创新&#xff0c;在提升客户体验、提高管理效率、降低经营成本等方面已具备很强的服务能力&#xff0c;让客户获得更方便、更快捷、更灵活的金融服务…