在vue框架中使用oss直传,前端直接调oss接口,服务端直接将所有文件存在同一个目录下(提高效率),之所以网页上看到有文件夹的区分,是因为根据前端命名方式(一般是自定义文件夹名字加文件名字加时间搓)来制造有文件夹区分的效果,这个命名可以理解成是这个文件的唯一标识。传给后端的时候直接把这个命名传入即可。

vue框架-前端oss直传

1.在阿里云新建配置跨域规则(header嫌麻烦配置成*即可,如不配置会产生跨域问题)

vue框架-前端oss直传

2.引入SDK-js

<script src="http://gosspublic.alicdn.com/aliyun-oss-sdk-4.4.4.min.js"></script>

3.新建组件(我是基于vue-element组件)

3.1 如何上传

 const client = new OSS.Wrapper({
          region: _this.region,
          accessKeyId: '',//填入自己的id
          accessKeySecret: '',//填入自己的id
          bucket: _this.bucket
        })

client.multipartUpload('重命名后的名字','文件内容',{上传进度回调})

3.2 如何浏览 (这里有个私有文件和公有文件的区别)

文档地址:https://help.aliyun.com/document_detail/64054.html?spm=a2c4g.11186623.6.771.HNKycx

私有图片拼接规则:

 var client = new OSS({ //这里是设置图片预览地址
                region: _this.region,
                accessKeyId: '',
                accessKeySecret: '',
                bucket: _this.bucket
              });
              var signUrl = client.signatureUrl(random_name, {expires: 6000, 'process' : 'image/resize,w_300'});
需要先去去获取权限(证明你有权限访问这张图片)

公有图片地址拼接规则:http://bucket.<endpoint>/object?x-oss-process=image/action,parame_value

<template>
  <div class="page">
    <div class="oss_file">
      <input type="file" :id="id"  @change="doUpload"/>
        <div>
          <p>
            上传进度:{{percentage}}
            {{percentage===1?"success!":(percentage===0?'waiting...':'uploading')}}
          </p>
        <div>
    </div>
  </div>
</template>
<script>
  export default {
    name: 'elOss',
    data () {
      return {
        region: 'oss-cn-hangzhou',
        bucket: '',//这里需要填入自己的bucket,申请完阿里云之后获得
        id: 'upload',
        baseurl:'',
        percentage: 0,
        url:'',
        urls:[]
      }
    },
    mounted() {
      this.getbaseurl();

    },
    methods:{
      getbaseurl(){ //文件夹命名
        var date=new Date;
        var year=date.getFullYear();
        var month=date.getMonth()+1;
        month =(month<10 ? "0"+month:month);
        var mydate = date.getDate();
        mydate =(mydate<10 ? "0"+mydate:mydate);
        this.baseurl = 'img/'+year+'/'+year+month+'/'+year+month+mydate+'/';
      },
      btnclick(){
        var btn = document.getElementById(this.id);
        btn.click()
      },
      doUpload () {
        const _this = this
        const urls = [];
        const client = new OSS.Wrapper({
          region: _this.region,
          accessKeyId: '',//填入自己的id
          accessKeySecret: '',//填入自己的id
          bucket: _this.bucket
        })
        _this.percentage = 0;
        const files = document.getElementById(_this.id)
        if (files.files) {
          const fileLen = document.getElementById(_this.id).files;
          var file = fileLen[0];
          if(file) {
            if (!file.type.match('image.*')) {
              this.$message.error('请上传图片格式的文件');
              return;
            }
          }
          let resultUpload = ''
          for (let i = 0; i < fileLen.length; i++) {
            const file = fileLen[i]
            // 随机命名
            let random_name = this.baseurl+this.random_string(6) + '_' + new Date().getTime() + '.' + file.name.split('.').pop()
            // 上传
            client.multipartUpload(random_name, file, {
              progress: function* (percentage, cpt) {
                // 上传进度
                _this.percentage = percentage
              }
            }).then((results) => {
              // 上传完成
              var client = new OSS({ //这里是设置图片预览地址
                region: _this.region,
                accessKeyId: '',
                accessKeySecret: '',
                bucket: _this.bucket
              });
              var signUrl = client.signatureUrl(random_name, {expires: 6000, 'process' : 'image/resize,w_300'});
             console.log(signUrl)
            }).catch((err) => {
              this.$message.error(err);
            })
          }
        }

      },
      // 随机生成文件名
      random_string(len) {
        len = len || 32;
        var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
        var maxPos = chars.length;
        var pwd = '';
        for (let i = 0; i < len; i++) {
          pwd += chars.charAt(Math.floor(Math.random() * maxPos));
        }
        return pwd;
      }
    },
    watch:{
      url(val){
        if(val){
          this.urls.push(val);
        }
      }
    }
  }
</script>

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-21
  • 2023-03-22
  • 2022-02-09
  • 2021-11-30
  • 2021-04-07
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-11-30
  • 2021-11-30
  • 2022-01-10
  • 2021-08-16
相关资源
相似解决方案