基于vue的图片裁剪插件vue-cropper ,上传图片到腾讯云存储

  • 2020 年 3 月 11 日
  • 筆記

网上找了点教程,结合之前框架里就有的修改了一下,没做细节优化处理

demo 16:9的尺寸,自己可以修改

步骤:

npm install vue-cropper

组件内使用  import { VueCropper }  from 'vue-cropper'  components: {    VueCropper,  },
<!--截图start-->  <CutImages ref="cutStatus"  :option="option" v-on:updateBaseimg="updateBaseimg"/>  <!--截图end-->

使用方法 具体看下面

<template>      <div>       <div class="intro-upload-img">                                      <a href="javascript:;" class="file">                                          <div v-if="!moreSet.imageUrl">上传</div>                                          <div v-if="moreSet.imageUrl" class="upload-img-url">                                              <img :src="moreSet.imageUrl"/>                                          </div>                                          <input type="file" @change="fileUpload($event)">                                      </a>                                  </div>          <CutImages ref="cutStatus"  :option="option" v-on:updateBaseimg="updateBaseimg"/>          <!--截图end-->      </div>  </template>    <script>      import CutImages from "@/components/cut";      import COS from 'cos-js-sdk-v5' //存储桶      export default {          components: {             CutImages          },          name: "index",          data() {              return {                  showCut: false,//截图插件的弹窗                  option: {   //配置文件                      img: '',                      info: true,                      size: 1,                      outputType: 'jpeg',                      canScale: true,                      autoCrop: true,                      // 只有自动截图开启 宽度高度才生效                      autoCropWidth: 300,                      autoCropHeight: 250,                      fixed: true,                      // 真实的输出宽高                      infoTrue: true,                      fixedNumber: [16, 9]                  },                  //更多设置                  moreSet: {                      imageUrl: '',                  },                  cosData: {}, //存储桶                  classid: '',//课堂id              }          }, created() {            },          methods: {              /**               * 获取截图的文件对象               * 进行图片上传到腾讯云               * **/              updateBaseimg(event) {                  let _this =this                  _this.showCut = false //隐藏截图插件                  if (!event) return                  _this.initCallBack()                  const time = _this.getTime()                  this.cosData.putObject({                      Bucket:bucket, /* 必须 */                      Region:region, /* 必须 */                      Key: 'classroom/' + time + '/' + event.name, /* 必须 */                      StorageClass: 'STANDARD',                      Body: event, // 上传文件对象                      onProgress: function (progressData) {                          // console.log(JSON.stringify(progressData))                      }                  }, function (err, data) {                      _this.moreSet.imageUrl = 'http://' + data.Location                  });              },                /**               * 设置图片上传               * 获取文件对象,调用截图插件               * **/              fileUpload(event) {                  let _this = this                  _this.$refs.cutStatus.getFileInfo(event)              },          }      }  </script>  <style lang="less" scoped>    </style>

组件:

<template>      <div class>          <el-dialog title="编辑图片" :visible.sync="showCut" :before-close="close" :width="'832px'"                     :close-on-click-modal="false">              <div>                  <div style="width: 800px;height: 600px">                      <vueCropper ref="cropper" :img="option.img " :outputSize="option.size"                                  :outputType="option.outputType"                                  :info="option.info" :canScale="option.canScale" :autoCrop="option.autoCrop"                                  :autoCropWidth="option.autoCropWidth" :autoCropHeight="option.autoCropHeight"                                  :fixed="option.fixed"                                  :fixedNumber="option.fixedNumber" :enlarge="4"></vueCropper>                  </div>              </div>              <div slot="footer" class="dialog-footer">                  <el-button @click="close" size="small">取 消</el-button>                  <el-button type="primary" @click="submit" size="small">确 定</el-button>              </div>          </el-dialog>      </div>  </template>    <script>      import {VueCropper} from "vue-cropper";      export default {          components: {VueCropper},          props: ["option"],          data() {              return {                  filename:'',  //图片名称                  showCut:false,//弹窗              };          },          computed: {},          watch: {},          methods: {              /**               * 获取文件对象               * **/              getFileInfo(e) {                  this.showCut = true                  this.option.img = ''                  this.filename = e.target.files[0].name                  var file = e.target.files[0]                  if (!/.(gif|jpg|jpeg|png|bmp|GIF|JPG|PNG)$/.test(e.target.value)) {                      alert('图片类型必须是.gif,jpeg,jpg,png,bmp中的一种')                      return false                  }                  var reader = new FileReader()                  reader.onload = (e) => {                      let data                      data = e.target.result                      if (typeof e.target.result === 'object') {                          // 把Array Buffer转化为blob 如果是base64不需要                          data = window.URL.createObjectURL(new Blob([e.target.result]))                      } else {                          data = e.target.result                      }                      this.option.img = data                  }                  // 转化为base64                  // reader.readAsDataURL(file)                  // 转化为blobcs                  reader.readAsArrayBuffer(file)              },              /**               * 提交               * data:是文件对象               * dataURLtoFile:base64转文件               * **/              submit() {                  this.$refs.cropper.getCropData((data) => {                      const info  = this.dataURLtoFile(data,this.filename)                      this.$emit("updateBaseimg",info);                      this.showCut = false                  })              },              /**               * base64转文件               * @param dataurl:图片的链接或者base64,filename:图片的名称               * **/              dataURLtoFile(dataurl, filename) {                  var arr = dataurl.split(","),                      mime = arr[0].match(/:(.*?);/)[1],                      bstr = atob(arr[1]),                      n = bstr.length,                      u8arr = new Uint8Array(n);                  while (n--) {                      u8arr[n] = bstr.charCodeAt(n);                  }                  return new File([u8arr], filename, {                      type: mime                  });              },              /**               * 关闭弹窗               * **/              close() {                  this.showCut = false                  this.option.img = ''              },                // getBase64() {              //     this.$refs.cropper.getCropData(data => {              //         const formData = new FormData();              //         formData.append("file", this.dataURLtoFile(data, "123.jpeg"));              //         formData.append("category", this.option.category);              //         fileupload(formData).then(res => {              //             this.$emit("updateBaseimg", {              //                 url: res,              //                 key: this.option.key              //             });              //             this.$notify({              //                 type: "success",              //                 message: "上传成功",              //                 title: "提示"              //             });              //         });              //     });              // },          },          created() {          },          mounted() {          }      };  </script>  <style lang='less' scoped>  </style>