vue后台管理上传图片并实现图片裁剪

首先将上传图片组件的action地址设置为空,再绑定上传文件之前的钩子函数handeleBeforeUpSwiperImage,return false,停止上传,在上传文件之前的钩子函数中获取返回的文件信息,

<Upload
   :show-upload-list="false"
   :on-success="upImages"
   :before-upload="handeleBeforeUpSwiperImage"
   :on-exceeded-size="upImagesExceededSize"
   :action="''"
   :data="goodUrl"
   :max-size="5120"
   multiple
   name="file"
   type="drag"
   style="display: inline-block;width:58px;"
 >
   <div style="width: 58px; height: 58px; line-height: 58px">
     <Icon type="ios-camera" size="20"></Icon>
   </div>
 </Upload>

window.URL.createObjectURL(new Blob([file]))
创建一个新的对象URL,该对象URL可以代表某一个指定的file对象或者bold对象。
可以用于在浏览器上预览本地的图片或者视频。

// 上传文件之前的钩子 轮播图
handeleBeforeUpSwiperImage(file){
  this.uploadType = "swiperImage"
  this.$refs.cropRef.fileinfo = file
  this.$refs.cropRef.fileName = file.name
  let data = window.URL.createObjectURL(new Blob([file]));
  this.$refs.cropRef.option.img = data
  this.$refs.cropRef.showImage = true
  return false;//取消自动上传
},

安装vue-cropper命令: npm install vue-cropper
图片裁剪组件代码:

<template>
  <div>
    <Modal
      v-model="showImage"
      title="图片裁剪"
      :loading="loading"
      @on-ok="confirmImage()"
      @on-cancel="cancelImage()"
      width="80%"
    >
      <div class="cropper">
        <vue-cropper
          ref="cropper"
          :img="option.img"
          :output-size="option.size"
          :output-type="option.outputType"
          :info="true"
          :can-move="option.canMove"
          :can-move-box="option.canMoveBox"
          :fixed-box="option.fixedBox"
          :auto-crop="option.autoCrop"
          :auto-crop-width="option.autoCropWidth"
          :auto-crop-height="option.autoCropHeight"
          :center-box="option.centerBox"
          :high="option.high"
          :info-true="option.infoTrue"
          @realTime="realTime"
          :enlarge="option.enlarge"
          :fixed="option.fixed"
          :fixed-number="option.fixedNumber"
          :limitMinSize="option.limitMinSize"
          />
      </div>
    </Modal>
  </div>
</template>

<script>
import { VueCropper } from 'vue-cropper'
import axios from "axios"
export default {
  name: "vueCropperModal",
  props: {},
  data() {
    return {
      uploadImage: xxxxxxxxx, //上传图片地址
      showImage: false, // 图片裁剪modal
      option: {
        img: '', // 裁剪图片的地址
        info: true, // 裁剪框的大小信息
        outputSize: 0.1, // 裁剪生成图片的质量
        outputType: 'png', // 裁剪生成图片的格式
        canScale: true, // 图片是否允许滚轮缩放
        autoCrop: true, // 是否默认生成截图框
        autoCropWidth: 600, // 默认生成截图框宽度
        autoCropHeight: 600, // 默认生成截图框高度
        fixedBox: true, // 固定截图框大小 不允许改变
        fixed: true, // 是否开启截图框宽高固定比例
        fixedNumber: [1, 1], // 截图框的宽高比例
        full: false,         //false按原比例裁切图片,不失真
        canMoveBox: false, // 截图框能否拖动
        original: true, // 上传图片按照原始比例渲染
        centerBox: false, // 截图框是否被限制在图片里面
        infoTrue: false, // true 为展示真实输出图片宽高 false 展示看到的截图框宽高
        maxImgSize: 2000,    //限制图片最大宽度和高度
      },
      fileinfo:'',
      loading: false, // 防止重复提交
      fileName: '', // 文件名称
      high: false, // 是否按照设备的 dpr 输出等比例图片
    };
  },
  components:{
    VueCropper
  },
  mounted() {},
  methods: {
    // 裁剪时触发的方法,用于实时预览
    realTime (data) {
      // this.previews = data;
    },
    // 确定
    confirmImage() {
      let that = this
      this.$refs.cropper.getCropBlob((data) => {
        // console.log(data,"裁剪后图片")
        that.loading = true
        // 这么写是因为文件转换是异步任务
        let transToFile = async(blob, fileName, fileType) => {
          return new window.File([blob], fileName, {type: fileType})
        }
        // 转换完成后可以将file对象传给接口
        transToFile(data, "image", "image/png").then((res)=> {
          // console.log(res)
          let fileFormData = new FormData(); 
          fileFormData.append('file',res,this.fileName)// 要传的参数
          fileFormData.append('item',"goods")
          const instance = axios.create({
            withCredentials: true // 解决跨域
          })
          instance({
            url: this.uploadImage,
            method: 'POST',
            data: fileFormData,
          }).then(res => {
            that.loading = false
            if(res.data.code != 200){
              this.$message.error(res.data.msg);
            }
            let {fileName} = res.data.obj
            this.$emit("getFile",fileName)
            // console.log(res,'res')
          })
        })
      })
    },
    // 取消
    cancelImage(){
      this.showImage = false;
    },
  },
};
</script>

<style scoped>
.cropper{
  width: auto; // 要设置样式,不然图片展示不出来
  height: 800px;
}
</style>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值