PC端上传头像及裁剪功能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36070288/article/details/84579019
  1. 基于vue框架
  2. 借助elementUI框架做为上传组件
  3. 借助vue-cropper做为裁剪工具

话不多说,先看效果:

上传头像组件:

<div class="app-head">
    <h3>小程序头像</h3>
    <div class="right">
        <el-upload
            class="avatar-uploader"
            action="http://up.qiniu.com/"
            :data="{'token':token}"
            :show-file-list="false"
            :on-success="successBizLicense"
            :before-upload="beforeBizLicense"
        >
            <img v-if="imageUrl" :src="imageUrl" class="avatar">
            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
        </el-upload>
        <span class="right-r">图片格式只支持:BMP、JPEG、JPG、GIF、PNG,大小不超过2M</span>
    </div>
</div>
  • action:必选参数,上传的地址(类型:string)

       - 这里借助七牛云上传资源,即:http://up.qiniu.com/

  • data:上传时附带的额外参数(类型:object)

       - 这里是上传到七牛所必须的upToken,即代码中的{'token':token},注意必须是对象形式

       - 该upToken获取方式:(以下是七牛云文档获取upToken写法)

uptoken : '<Your upload token>', // uptoken是上传凭证,由其他程序生成
uptoken_url: '/uptoken',         // Ajax请求uptoken的Url,强烈建议设置(服务端提供)
uptoken_func: function(){    // 在需要获取uptoken时,该方法会被调用
   // do something
   return uptoken;
},

      - 这里获取upToken方法,直接通过请求后台接口,给大家简单看下:

// 获取上传图片的upToken
getToken() {
   const that = this
   that.$store.dispatch('imageToken').then(res => {
      that.token = res.token
   })
}

// imageToken即请求后台接口获取upToken的方法,这里就不展示了
  • show-file-list:是否显示已上传文件列表(默认:true)

      - 这里是单张图片,所以设置为false

  • on-success:文件上传成功时的钩子(类型:function(response, file, fileList))

      - 给大家看看本文的写法:

// 头像
successBizLicense(res, file) {
   const that = this
   that.option.img = showUrl + '/' + file.response.key
   that.cropperFlag = true
}

      - 把上传七牛云的图片url给到裁剪组件

      - showUrl在这里为项目部署的域名前缀,接上key即为图片存储在七牛云上的地址

      - cropperFlag控制裁剪组件显示隐藏

  • before-upload:上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传。(类型:function(file))

      - 这里用这个钩子来控制图片大小过大的情况:

// 上传头像之前
beforeBizLicense(file) {
   const isLt2M = file.size / 1024 / 1024 < 2
   if (!isLt2M) {
      return false
      this.$message.error('上传头像图片大小不能超过 2MB!')
   }
   return isLt2M
}

裁剪组件得到Url后,接着介绍裁剪组件相关属性:

裁剪工具的option对象内容:

option: {
    img: '', // 裁剪图片的地址
    info: true, // 裁剪框的大小信息
    outputSize: 1, // 裁剪生成图片的质量
    outputType: 'jpeg', // 裁剪生成图片的格式
    canScale: true, // 图片是否允许滚轮缩放
    autoCrop: true, // 是否默认生成截图框
    autoCropWidth: 144, // 默认生成截图框宽度
    autoCropHeight: 144, // 默认生成截图框高度
    fixedBox: true
},
  • img:需裁剪的图片地址即通过上传头像组件得到的url
  • info:裁剪框大小,这里是500px*500px
  • outputSize: 裁剪生成图片质量0.1-1
  • outputType:裁剪生成图片格式
  • canScale:图片是否允许缩放
  • autoCrop:是否默认生成裁剪框 
  • autoCropWidth和autoCropHeight:截图大小,这里固定为144px*144px
  • fixedBox:固定截图框大小 不允许改变

裁剪组件:  

<div class="cropper" v-if="cropperFlag">
    <vueCropper
        class="content"
        ref="cropper"
        :img="option.img"
        :outputSize="option.outputSize"
        :outputType="option.outputType"
        :info="option.info"
        :canScale="option.canScale"
        :autoCrop="option.autoCrop"
        :autoCropWidth="option.autoCropWidth"
        :autoCropHeight="option.autoCropHeight"
        :fixedBox="option.fixedBox"
    >
    </vueCropper>
    <button class="cropper-btn" @click="onCubeImg">截图并上传</button>
    <img class="delete-icon" src="http://common.static.sangeayi.cn/shop_wx/images/[email protected]" @click="hideCropper"/>
</div>
  • onCubeImg:此方法 做了什么,大家看下面:
// 确定裁剪图片
onCubeImg() {
   // 获取cropper的截图的base64 数据
   const that = this
   that.$refs.cropper.getCropData(data => {
      const file = data.split(',')[1]
      that.putb64(file)
   })
}

      - that.$refs.cropper.getCropData(res => {}) :获取截图的base64数据

      - data.split(',')[1] :记得把base64数据逗号前的数据截取掉,逗号后的数据是我们需要的

      - that.putb64(file) :此方法是为了将base64上传到七牛云得到我们截图后的key

  • putb64方法具体内容如下:
// base64上传到七牛
    putb64(base64) {
      const that = this
      const pic = base64
      const url = 'http://upload.qiniup.com/putb64/-1' // 非华东空间需要根据注意事项 1 修改上传域名
      const xhr = new XMLHttpRequest()
      xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
          const obj = JSON.parse(xhr.responseText)
          that.imageUrl = showUrl + '/' + obj.key
          console.log(that.imageUrl)
          that.cropperFlag = false
        }
      }
      xhr.open('POST', url, true)
      xhr.setRequestHeader('Content-Type', 'application/octet-stream')
      xhr.setRequestHeader('Authorization', 'UpToken ' + that.token)
      xhr.send(pic)
    },

      - url:base64上传需要的url

      - JSON.parse(xhr.responseText): 记得将对象字符串转成json对象

      - that.imageUrl:即我们需要上传的小程序真正的头像

      - that.token:即upToken,上面讲到过,这里就不赘述了

看到最后的朋友,如果这篇文章对你有所帮助不妨点个赞或评论告诉我,证明这篇文章是有意义的

猜你喜欢

转载自blog.csdn.net/qq_36070288/article/details/84579019