vue3 TS vite element 阿里ossweb直传

微服务部落
• 阅读 1020

vue3 TS vite element ali-oss使用方式

  1. 安装ali-oss包

       npm i ali-oss -S
  2. 写一个ali-oss.ts文件,封装函数 Client

    const OSS = require('ali-oss')
    // import Oss from 'ali-oss'
    
    /**
     *  [accessKeyId] {String}:通过阿里云控制台创建的AccessKey。
     *  [accessKeySecret] {String}:通过阿里云控制台创建的AccessSecret。
     *  [bucket] {String}:通过控制台或PutBucket创建的bucket。
     *  [region] {String}:bucket所在的区域, 默认oss-cn-hangzhou。
     */
    
    //Client.ts
     interface OSSData {
       region?: String //oss-cn-beijing-internal.aliyuncs.com
       accessKeyId?: String
       accessKeySecret?: String
       securityToken?: String
       bucket?: String
     }
    
    export default function Client(data:OSSData) {
      //后端提供数据
      return new OSS({
        region: 'oss-cn-beijing', //oss-cn-beijing-internal.aliyuncs.com
        accessKeyId: data.accessKeyId,
        accessKeySecret: data.accessKeySecret,
        stsToken: data.securityToken,
        bucket: data.bucket
      })
    }

    <div style='color:red;font-size:20px;'>这里注意<div>

    vite 默认不支持commonjs语法,所以使用require会报错。解决方案

    1. 安装vite-plugin-require-transform

      npm i vite-plugin-require-transform --save-dev
    2. 配置vite.config.js

       plugins: [
                   requireTransform({
              fileRegex: /.ts$|.tsx$|.vue$|.js$/
            })
       ]

    <div style='color:red;font-size:20px;'>再次注意<div>

    因为阿里OSS文档的后台示例

    package main
    
    import (
        "fmt"
        "github.com/aliyun/aliyun-oss-go-sdk/oss"
        "os"
    )
    
    func main() {    
        // 从STS服务获取的安全令牌(SecurityToken)。
        securitytoken := "yourSecurityToken" //上面获取的临时授权的数据里的Credentials.SecurityToken
        // 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
        // 从STS服务获取临时访问凭证后,您可以通过临时访问密钥和安全令牌生成OSSClient。
        // 创建OSSClient实例。
        // 第一个参数就是bucket的Endpoint,可以在对象储存oss控制台的bucket的概览得到,例如http://oss-cn-beijing.aliyuncs.com
        // 第二个参数就是上面获取的临时授权的数据里的Credentials.AccessKeyId
        // 第三个参数就是上面获取的临时授权的数据里的Credentials.AccessKeySecret
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret", oss.SecurityToken(securitytoken))
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)    
        }
        // 填写Bucket名称,例如examplebucket。
        bucketName := "examplebucket"
        // 填写Object的完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
        objectName := "exampledir/exampleobject.txt"
        // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
        filepath := "D:\\localpath\\examplefile.txt"
        bucket,err := client.Bucket(bucketName)
        // 通过STS授权第三方上传文件。
        err = bucket.PutObjectFromFile(objectName,filepath)
        fmt.Println(err)
    }
    

    所以后台返回token的名字是securitytoken,而ali-OSS的示例名叫stsToken,记住自己对应上,安装我的示例写

  3. element-plus代码

    <template>
    <el-upload
        accept=""
        v-model:file-list="fileList"
        :http-request="handleUpload"
        :before-upload="beforeUpload"
        action=""
        list-type="picture-card"
        :auto-upload="true"
      >
        <slot name="default" class="el-icon-plus" />
      </el-upload>
      </<template>
    <script lang="ts" setup>
    //Client.js 这里引入刚才封装好的Client函数
    import Client from './ali-oss.js'
    import { ref } from 'vue'
    import type { UploadUserFile } from 'element-plus'
    const fileList = ref<UploadUserFile[]>([])
    const handleUpload = async (option: Object) => {
      console.log(option)
    }
    // 这里是接口,会返回 
    import { OssAuthorize } from '@/utils/publicData'
    function beforeUpload(file: any) {
      console.log(file)
      OssAuthorize().then((response) => {
        // response.data.accessKeyId = response.data.accessKeyId.replace('STS.', '')
        const client = Client(response.data)
        client.multipartUpload(file.name, file).then((res: any) => {
          console.log(res)
        })
      })
    }
    </script>

    上传成功后会返回的数据里requestUrls

    这个是个数组 里面放的是图片链接

  4. 最后关于oss的方法使用

    Browser.js (alibabacloud.com)

  5. 补充上传文件类型、大小、图片像素判断,请写file.js并引入使用的地方

    //图片类型验证
    export function verificationFileType(file, fileTypes) {
      const filePath = file.name
      //当括号里面的值为0、空字符、false 、null 、undefined的时候就相当于false
      let isNext = false
      const fileEnd = filePath.substring(filePath.indexOf('.'))
      for (let i = 0; i < fileTypes.length; i++) {
        if (fileTypes[i] == fileEnd) {
          isNext = true
          break
        }
      }
      if (!isNext) {
        file.value = ''
        return false
      }
      return true
    }
    //图片大小验证
    export function verificationFileSize(file, maxSize) {
      const fileSize = file.size
      const size = fileSize / 1024
      if (size > maxSize) {
        return false
      } else if (size <= 0) {
        return false
      }
      return true
    }
    //图片尺寸验证
    export function verificationFilePixel(file, ratio = 1.5, cb) {
      //读取图片数据
      const filePic = file
      const reader = new FileReader()
      reader.onload = function (e) {
        const data = e.target.result
        //加载图片获取图片真实宽度和高度
        const image = new Image()
    ​
        image.src = data
        const width = image.width
        console.log(width)
        const height = image.height
        if (width / height === ratio) {
          cb && cb(true)
        } else {
          cb && cb(false)
          return false
        }
      }
      reader.readAsDataURL(filePic)
    }
    ​
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
4年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这