//- 上传点击区...">
最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 图片上传七牛云组件

    正文概述 掘金(牛盾蛤)   2021-03-06   577

    流程:

    1. 七牛云后台的对象存储功能
    2. node.js后台生成七牛云的token(或者直接从服务器获取),nodeJS获取方式参考最后
    <template lang="pug">
      //- 上传点击区域就可以由调用处决定
      .upload-img-to-qi-niu.full.flex.relative
        label.upload-img.full(for="inputId")
        input(ref="upload-img" id="inputId" type="file" :accept="uploadAccept" @change="handleFileChange" style="display: none")
        //- 选择图片后显示
        img.local-photo.absolute(v-if="imgSrc" :src="imgSrc")
    </template>
    
    import * as qiniu from 'qiniu-js'
    export default {
      name: 'upload-img-to-qi-niu',
      props: {
        uploadAccept : {
          type: String,
          default: 'image/png,image/gif,image/jpeg,image/jpg'
        }
      },
      data() {
        return {
          imgSrc: '',
        };
      },
    
      methods: {
        handleFileChange() {
          const { files } = this.$refs['upload-img']
          if (!files || !files.length) {
            this.$toast('该图片不支持上传')
            return
          }
          const file = files[0]
          console.log('图片大小:'+file.size)
          // if(file.size > 1024 * 1024 * 4) {
          //   this.$toast('图片大小不能超过 4MB!')
          //   return
          // }
          const URL = window.URL || window.webkitURL;
          this.imgSrc = URL.createObjectURL(file) 
    
          const fileType = file.type
          console.log(fileType,'文件类型')
          
          if (this.uploadAccept.split(',').findIndex(t => t === fileType) === -1) {
            this.$toast('请上传正确的图片格式')
            return
          }
            
          this.$emit('file-change', { imgSrc: this.imgSrc ,file })
        },
    	
        // 提供外部调用
        // file 
        uploadToQiNiu({ uid, sid, file}) {
          return new Promise((resolve, reject) => {
            this.getQiNiuToken(uid, sid).then(({ token, domain }) => {
              this.compressImg(file).then(dist => {
                const observable = qiniu.upload(dist,Date.now() + file.name,token,
                  {
                    fname: '',
                    params: {},
                    mimeType: null
                  },
                  {
                    useCdnDomain: true,
                    region: qiniu.region.z0
                  }
                )
                // 上传开始
                observable.subscribe({
                  complete(res) {
                    resolve( domain + res.key)
                  },
                  error(err) {
                    console.log('上传error: '+err)
                    reject(err.message)
                  }
                })
    
              })
            })
          })
        },
    	
        // 从服务器获取七牛云token
        getQiNiuToken (uid,sid) {
          return this.$req('xxx/xxx', { uid, sid },'POST').then(res => res)
        },
    
        compressImg(file) {
          return new Promise((resolve,reject) => {
            const options = {
              quality: 0.92,
              noCompressIfLarger: true,
              maxWidth: 1024,
              maxHeight: 1024
            }
            return qiniu.compressImage(file, options).then(data => {
              console.log('压缩图片结果: '+ data.dist)
              resolve(data.dist)
            }).catch((err) => {
              console.log('压缩图片错误: '+ err)
              reject(err)
            })
          })
        },
      }
    };
    </script>
    

    使用

    import uploadImgToQiNiu from '@/components/UploadImgToQiNiu'
    
      .upload-box
        upload-img-to-qi-niu(@file-change="onFileChange" ref="uploadComp")
      .upload-desc 点击上传图片
    
    onFileChange ({ file }) {
    	this.file = file
    },
    
    // 上传file到七牛云换取网络地址
    getImgNetWorkUrl(file) {
      return this.$refs.uploadComp.uploadToQiNiu({ uid, id,file }).then(screenshot => {
        return Promise.resolve(screenshot)
      })
    },
    
    onSummit () {
    	this.getImgNetWorkUrl(this.file).then(url => {
        	this.$req('xxx/uploda-url').then(() => {})
        })
    }
    

    nodeJ生成token

    1. 注册七牛云,在个人中心---《秘钥》获取如下三个参数
    // https://developer.qiniu.com/kodo/1289/nodejs
    var accessKey = 'your access key';
    var secretKey = 'your secret key';
    var mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
    var options = {
      scope: bucket,
    };
    var putPolicy = new qiniu.rs.PutPolicy(options);
    var uploadToken=putPolicy.uploadToken(mac);
    其它自行查阅
    
    

    归纳

    1. 通过input的file类型选择图片上传,获取图片的本地url路径file;
    2. 服务器一般只存储图片的网络地址,因此要将本地图片先上传到七牛云,换取网络地址后再将网络地址传递给服务器储存,具体步骤如下;
    3. 点击上传时,通过服务器获取七牛云存储的token,然后调用七牛云提供的上传图片的api,换取网络地址

    起源地下载网 » 图片上传七牛云组件

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元