美文网首页
vue整合华为云obs上传图片

vue整合华为云obs上传图片

作者: 邹小小白 | 来源:发表于2021-06-15 18:53 被阅读0次

    关于华为云,网上要找的资料很少很少.另外要吐槽一下华为云的文档,前篇找不到一点关于vue的技术文档.后来还打了官网技术的电话咨询.人家来了一句居然不支持vue的使用/顿时一脸懵逼,那怎么办,项目又必须用华为云的obs上传.
        好吧.算了自己来研究研究吧.居然支持BrowserJS的使用那么肯定可以在vue中使用起来.demo代码撸起来
    首先要下载sdk包.其实就是一个js文件引入
    下载SDK BrowserJS   

    1 官网下载BrowserJS 
    2 esdk-obs-browserjs  3.20.7 
    3 重要的一点BrowserJS 一个是含without-polyfil 另外一个是不含without-polyfil
    4 在项目中如果你有单独引入babel-polyfill的话,那你就用含without-polyfil的js文件、如果你没有就引入不含without-polyfil的js文件,这一点很重要,要不然你项目会冲突

    下面是我写的一个demo,比较简单.搭建凑合着看吧
    这个是一个请求封装的uploadImg.js

    import Vue from 'vue';

    import { ToastPlugin } from 'vux'

    Vue.use(ToastPlugin)

    let vm = new Vue()

    import { getObsConfigApi} from '@/api/common/getObsConfig.js'

    require("./esdk-obs-browserjs-without-polyfill-3.19.5.min.js");//因为我的项目里有装过babel-polyfill所以选择用来这个带without-polyfill***.js

    function generateUUID() {

      var d = new Date().getTime();

      if (window.performance && typeof window.performance.now === "function") {

        d += performance.now(); //use high-precision timer if available

      }

      var uuid = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(

        /[xy]/g,

        function (c) {

          var r = (d + Math.random() * 16) % 16 | 0;

          d = Math.floor(d / 16);

          return (c == "x" ? r : (r & 0x3) | 0x8).toString(16);

        }

      );

      return uuid;

    }

    function getObsClient(accessKey, secretKey, endPoint) {

      // eslint-disable-next-line no-undef

      var obsClient = new ObsClient({

        access_key_id: accessKey,

        secret_access_key: secretKey,

        server: endPoint,

        timeout: 60 * 5,

      });

      return obsClient;

    }

    export async function obsUpload(file,preview) {

      // return new Promise(async resolve => {

      // console.log('接收===')

      // console.log(file)

      let fileObj = file;

      // let fileContent = file.url;

      const {data} = await getObsConfigApi();

      const { accessKey,bucketName,endPoint, secretKey } = data;

      const objectKey = generateUUID(); // 文件的uuid

      getObsClient(accessKey, secretKey, endPoint)

        .putObject({

          Bucket: bucketName,

          Key: objectKey,

          Metadata: {

            property: "property-value"

          },

          SourceFile: fileObj,

        })

        .then(function (result) {

          // console.log(result);

          console.log(`https://${bucketName}.${endPoint}/${objectKey}`);// 这个就是最终生成的访问路径

          vm.$vux.toast.show({

              type: 'text',

              position: 'middle',

              text: "上传成功"

          })

          preview.unshift({src:`https://${bucketName}.${endPoint}/${objectKey}`})

        })

        .catch(function (err) {

          console.error(err);

          vm.$vux.toast.show({

            type: 'text',

            position: 'middle',

            text: "上传失败,请重新上传"

          })

        });

      // });

    }

    在项目中只需要调用一下就OK了.so easy
    obsUpload(item,this.preview)
    // item就是你上传的flie文件
    //this.preview就是一个你保存的数组 可以预览回显用
    <input id="fileUpload" name="file" type="file" :multiple="multiple" @change="imageLoad">
    imageLoad (e) {

                let images = {};

                // 过滤非图片

                for (let v of e.target.files) {

                    if (v.type.search('image') !== -1) {

                        images[v.name] = v;

                    }

                }

                // 加载已有图片

                for (let v of this.images) {

                    images[v.name] = v;

                }

                // 过滤重复文件

                this.images = [...new Set(Object.keys(images))].reduce((a, b) => {

                    a.push(images[b]);

                    return a;

                }, []);

                // limit

                if (this.images.length > this.limit) {

                    this.images.length = this.limit;

                }

                // 加载预览图

                this.preview.length = 0;

                this.images.forEach(item=>{

                    obsUpload(item,this.preview)

                    this.imageSync();//触发到父组件操作逻辑

                })

            },

    好了.这个坑踩了一下下午才搞出来.希望可以帮到那些项目必须用到华为云obs上传到同学、、、、
    最后提示:能不能就不用.真的挺麻烦的,七牛/阿里文档又简单,一看就会.那些文档简单一撸就会的第三方上传不香吗???慎用

    相关文章

      网友评论

          本文标题:vue整合华为云obs上传图片

          本文链接:https://www.haomeiwen.com/subject/cqttyltx.html