文件上传(WebUploader)成功之前自定义裁剪(vue-img-cutter),上传裁剪的图片,并兼容ie

2 篇文章 0 订阅
1 篇文章 0 订阅

上传文件使用的是WebUploader,可 分片、并发、文件体积大时支持MD5秒传
地址:http://fex.baidu.com/webuploader/
思路: 初始化上传组件,使用vue-img-cutter的裁剪;在裁剪成功之后;为兼容ie, 将裁剪获得的base64Url格式的图片地址转成bolo文件,追加到上传队列之中;调用上传方法继续进行上传,以确保上传的是裁剪后的图片
使用方法:
第一步:先引用webuploader.js,建议下载下来放在本地直接使用
安装依赖vue-img-cutter并引用
第二步:初始化webUploader
代码如下

<template>
  <div class="logoF1 fl">
    <div>
      <ImgCutter @cutDown="cutDown" label="上传LOGO"
        :cutWidth="180"
        :cutHeight="40"
        :moveAble="true"
        :sizeChange="false"
        WatermarkText=""></ImgCutter>
     </div>
     <div class="upload-wrap" v-show="false">
       <div id="uploader" class="wu-example">
          <div class="btns">
             <div id="picker" class="up-btn">上传LOGO</div>
             </div>
          </div>
      </div>
    </div>
  </div>
</template>
import ImgCutter from 'vue-img-cutter'
import webuploader from '@/utils/webuploader.js'
export default {
  components: {
    ImgCutter
  },
  data () {
    return {
      ruleForm: {
        logoUrl: '',
        logoId: ''
      },
      uploader: null, // 文件
      cropperFiles: [], // 裁剪之后的文件
    }
  },
  mounted () {
  this.init()
  },
  methods () {
    cutDown (res) {
      this.logoFileName = res.fileName
      // 裁剪之后base64Url 转成流文件
      let blob = this.dataURLtoBlob(res.dataURL)
      this.fileList = res.dataURL
      // 将流追加进队列
      this.uploader.addFiles(blob)
    },
    init () {
      // 初始化webuploader
      this.uploader = webuploader.create({
        // 选择文件的按钮
        pick: '#picker',
        // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
        compress: false,
        // 是否开启大文件分片上传,默认为true
        chunked: true,
        // 分片上传线程数,默认为3,如果使用断点续传建议线程数改为1
        threads: 1,
        // 如果某个分片由于网络问题出错,允许自动重传多少次,默认为2
        chunkRetry: 2,
        // 每一片的大小,默认为10M
        chunkSize: 1024 * 1024 * 10,
        // 上传超时时间,默认为2分钟
        timeout: 15 * 60 * 1000,
        // 是否允许同一个文件重复上传,默认为false
        duplicate: true,
        // 非官方参数,文件大小超过该值则进行分片,默认为10M
        thresholdSize: 1024 * 1024 * 10,
        // 非官方参数,是否支持切换至阿里云,有特殊需求的项目可以开通此项,需要进行授权,默认为false
        uploadToThirdPartyStorage: false,
        // 非官方参数,是否开启秒传,默认为true,强烈建议开启。秒传关闭情况,阿里云分片上传默认无MD5
        checkMd5: true
      })
      let _this = this
      // 上传文件之前
      this.uploader.on('beforeFileQueued', function (file) {
        let type = ['bmp', 'gif', 'png', 'jpg', 'jpeg']
        let size = 10485760
        _this.file = file
        // 校验校验类型
        if (type && type.indexOf(file.ext.toLowerCase()) === -1) {
          _this.$message.info({
            message: '文件格式错误,请重新选择上传!',
            offset: 100
          })
          return false
        }
        // 检验文件大小
        if (file.size === 0) {
          _this.$message.info({
            message: `不得上传空文件`,
            offset: 100
          })
          return false
        }
        if (file.size > size) {
          _this.$message.info({
            message: `文件不得大于10M`,
            offset: 100
          })
          return false
        }

        _this.fileName = file.name
        return true
      })
      // 当上传的文件加入队列以后触发
      this.uploader.onFileQueued = function (file) {
        _this.cropperFiles = []
        file.name = _this.logoFileName
        // upload()开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程
        _this.uploader.upload()
      }
      // 上传成功
      this.uploader.on('uploadSuccess', function (file) {
        // 将上传的文件放在裁剪文件列表中
        _this.cropperFiles = [{
          fileId: file.id,
          fileType: file.ext,
          fileSize: file.size,
          fileName: _this.logoFileName,
          percentage: 100, // 进度完成
          fileUrl: file.url,
          id: file.contextId
        }]
        _this.filesLogo = _this.cropperFiles
        _this.ruleForm.logoUrl = _this.filesLogo[0].fileUrl
        _this.ruleForm.logoId = _this.filesLogo[0].id
        _this.showCropee = false
      })
      // 上传过程中进度显示
      this.uploader.on('uploadProgress', function (file, percentage) {
        _this.cropperFiles = [{
          percentage: percentage
        }]
      })
    },
  }
}

如有其他文件裁剪并上传的方法,希望大家告知,以供学习;先说谢谢了

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用vant-uploader和vue-cropper来实现裁剪图片上传,你可以按照以下步骤进行操作: 1. 首先,安装vant和vue-cropper插件。你可以使用npm或yarn来安装它们。 2. 在你的Vue组件中,引入vant-uploader和vue-cropper组件。 3. 在模板中,使用vant-uploader组件来实现图片上传功能。设置上传的action属性为你的上传接口地址,并设置on-success事件来处理上传成功后的逻辑。 4. 在on-success事件中,获取到上传成功后的图片地址,并将其传递给vue-cropper组件。 5. 在vue-cropper组件中,设置裁剪框的样式和裁剪比例等属性。使用v-model指令来绑定裁剪后的图片数据。 6. 在提交按钮的点击事件中,将裁剪后的图片数据上传到服务器。 下面是一个简单的示例代码: ```vue <template> <div> <van-uploader action="/upload" :on-success="handleUploadSuccess" ></van-uploader> <vue-cropper v-if="showCropper" :src="cropperSrc" :output-size="{ width: 200, height: 200 }" :output-type="'jpeg'" :fixed-box="true" :fixed-number="\[1, 1\]" v-model="croppedImage" ></vue-cropper> <button @click="handleSubmit">提交</button> </div> </template> <script> import { VanUploader } from 'vant'; import VueCropper from 'vue-cropper'; export default { components: { VanUploader, VueCropper, }, data() { return { showCropper: false, cropperSrc: '', croppedImage: '', }; }, methods: { handleUploadSuccess(response) { // 获取上传成功后的图片地址 const imageUrl = response.data.imageUrl; // 显示裁剪组件 this.showCropper = true; // 设置裁剪组件的图片地址 this.cropperSrc = imageUrl; }, handleSubmit() { // 提交裁剪后的图片数据到服务器 // this.croppedImage 包含裁剪后的图片数据 }, }, }; </script> ``` 请注意,以上代码只是一个简单的示例,你需要根据你的实际需求进行适当的修改和调整。同时,你还需要在后端实现相应的上传裁剪功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值