vue+element-ui+阿里云OSS 自动上传文件

1.安装阿里云OSS: npm install ali-oss --save
2.新建ali-oss.js文件

// 引入ali-oss
import {
  getJsonLocal
} from './common'

import axios from "axios";
import {
  baseUrl
} from "@/api/http.js";

let OSS = require('ali-oss')
let client
export let progress // 上传进度

function getAliToken() {
  const $aliToken = axios.create({
    withCredentials: true,
    headers: {
      "ACCESS-TOKEN": getJsonLocal("cmsToken") || "*",
    },
  });
// 后端的接口,用来获取临时凭证
  $aliToken.get(baseUrl + "/app/ali_ststoken").then((res) => {
    if (res.status == 200) {
      /**
       *  [accessKeyId] {String}:通过阿里云控制台创建的 或者 通过后端接口获取 AccessKey。
       *  [accessKeySecret] {String}:通过阿里云控制台创建的或者 通过后端接口获取AccessSecret。
       *  [bucket] {String}:通过控制台或PutBucket创建或者 通过后端接口获取bucket。
       *  [region] {String}:bucket所在的区域, 默认oss-cn-hangzhou。
       */
      client = new OSS({
        region: 'oss-cn-shenzhen',
        secure: true, // secure: 配合region使用,如果指定了secure为true,则使用HTTPS访问
        accessKeyId: res.data.AccessKeyId,
        accessKeySecret: res.data.AccessKeySecret,
        stsToken: res.data.SecurityToken,
        bucket: 'cline'
      })

    } else {
      this.$message.error("获取阿里云临时token失败");
    }
  });
}
getAliToken()


/** 
 *  上传文件,大小不能超过5GB 
 * @param {string} ObjName OSS的储存路径和文件名字 
 * @param {string} fileUrl 本地文件 
 * @retruns Promise 
 */
  // ObjName为文件名字,可以只写名字,就直接储存在 bucket 的根路径,如需放在文件夹下面直接在文件名前面加上文件夹名称    
export const put = async (ObjName, fileUrl) => {
  try {
    let result = await client.multipartUpload(`${ObjName}`, fileUrl, {
      progress: function (p) {
        progress = p * 100
      }
    })
    return result
  } catch (e) {
    console.log(e)
  }
}
// 上传成功之后,转换真实的地址
// 后台只需要传入文件名,回显时候同样也只是返回文件名,说做数据迁移管理时候不麻烦,反正意思就是上传出现问题都和他们无关,so,没办法,所以需要自己根据返回文件名进行转码,生成所需要的url

export const signatureUrl = async (ObjName) => {
  try {
    let result = await client.signatureUrl(`${ObjName}`)
    return result
  } catch (e) {
    console.log(e)
  }
}

// 随机UUID
export const getFileNameUUID = () => {
  function rx() {
    return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)
  }
  return `${+new Date()}_${rx()}${rx()}`
}

3。在vue页面中,配合element-ui的upload组件的应用

<template>
 <el-upload
                  ref="upload"
                  action="fakeaction"
                  :http-request="uploadFunc" //用自定义上传方法
                  :limit="1"
                  :auto-upload="true"
                  :file-list="fileList"
                  :before-upload="beforeUploadFunc"
                  :on-change="onChange"
                  :on-remove="onRemove"
                >
</template>
<script>
import { put, signatureUrl, getFileNameUUID, progress } from "@/api/ali-oss";
data () {
return {
    fileList:[],
    fileName:' ', //文件名字
    progressNum:0 // 文件上传进度
  }
},
methods:{
   // 文件状态改变
    onChange(file, fileList) {
      if (file) {
        this.fileList = fileList.slice(-3);
      }
    },
    // 上传文件之前的钩子, 参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传
    beforeUploadFunc(file) {
      console.log(file)
      let extension = file.name.substring(file.name.lastIndexOf(".") + 1);
      let size = file.size / 1024 / 1024;
      if (extension !== "zip") {
        this.$message.error("只能上传后缀是.zip的文件");
        return false;
      }
      if (size > 30) {
        this.$message.error("文件大小不得超过30M");
        return false;
      }
    },
// 删除文件
   onRemove(file, fileList) {
      this.fileList= [];
    },
  uploadFunc(param){
    let objName = getFileNameUUID();
      let obj = param.file.name;
      let index = obj.lastIndexOf(".");
      obj = obj.substring(index, obj.length);
      objName = getFileNameUUID() + param.file.name;
      put(`fileName/${objName}`, param.file).then((res) => {
        this.fileName = res.name;
        this.progressNum= progress;
      });
  }
}
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343