zoukankan      html  css  js  c++  java
  • 图片上传以及图片压缩

    html:

    <input type="file" class="reply-thumb__input" name="image" accept="image/*" @change='handleInputChange' />

    js:

    handleInputChange (event) {
          // if (this.picData.length >= 9) return
          // debugger
          const file = event.target.files[0]
          const imgMasSize = 1024 * 1024 * 8
          // 检查文件类型
          if (['jpeg', 'png', 'gif', 'jpg'].indexOf(file.type.split('/')[1]) < 0) {
            // 自定义报错方式
            // Toast.error('文件类型仅支持 jpeg/png/gif!', 2000, undefined, false)
            // Toast.fail('文件类型仅支持 jpeg/png/gif!', 2000)
            // Toast.fail('文件类型仅支持 jpeg/png/gif!', 2000)
            return
          }
          // 文件大小限制
          if (file.size > imgMasSize) {
            // 文件大小自定义限制
            Toast({
              message: '文件大小不能超过2MB!',
              className: 'hint-message'
            })
            return
          }
          const reader = new FileReader()
          const img1 = event.target.files[0]
          reader.readAsDataURL(img1)
          // reader.onloadend = () => {
          //   this.curImg.url = reader.result
          //   this.curImg.id = this.count++
          // }
          // 判断是否是ios
          // if (window.navigator.userAgent.match(/(i[^;]+;( U;)? CPU.+Mac OS X/)) {
          //   // iOS
          //   this.transformFileToFormData(file)
          //   return
          // }
          // 图片压缩之旅
          this.transformFileToFormData(file)
        },
        transformFileToFormData (file) {
          const formData = new FormData()
          // 自定义formData中的内容
          /*
            三个参数
            file:一个是文件(类型是图片格式),
            w:一个是文件压缩的后宽度,宽度越小,字节越小
            objDiv:一个是容器或者回调函数
            photoCompress()
             */
          function photoCompress (file, w, objDiv) {
            const ready = new FileReader()
            /* 开始读取指定的Blob对象或File对象中的内容. 当读取操作完成时,readyState属性的值会成为DONE,如果设置了onloadend事件处理程序,则调用之.同时,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容. */
            ready.readAsDataURL(file)
            ready.onload = function () {
              let re = this.result
              canvasDataURL(re, w, objDiv)
            }
          }
          function canvasDataURL (path, obj, callback) {
            var img = new Image()
            img.src = path
            img.onload = function () {
              var that = this
              // 默认按比例压缩
              var w = that.width
              var h = that.height
              var scale = w / h
              w = obj.width || w
              h = obj.height || (w / scale)
              var quality = 0.7 // 默认图片质量为0.7
              // 生成canvas
              var canvas = document.createElement('canvas')
              var ctx = canvas.getContext('2d')
              // 创建属性节点
              var anw = document.createAttribute('width')
              anw.nodeValue = w
              var anh = document.createAttribute('height')
              anh.nodeValue = h
              canvas.setAttributeNode(anw)
              canvas.setAttributeNode(anh)
              ctx.drawImage(that, 0, 0, w, h)
              // 图像质量
              if (obj.quality && obj.quality <= 1 && obj.quality > 0) {
                quality = obj.quality
              }
              // quality值越小,所绘制出的图像越模糊
              var base64 = canvas.toDataURL('image/jpeg', quality)
              // 回调函数返回base64的值
              callback(base64)
            }
          }
          /**
             * 将以base64的图片url数据转换为Blob
             * param urlData
             *            用url方式表示的base64图片数据
             */
          function convertBase64UrlToBlob (urlData) {
            var arr = urlData.split(',')
            let mime = arr[0].match(/:(.*?);/)[1]
    
            let bstr = atob(arr[1])
            let n = bstr.length
            let u8arr = new Uint8Array(n)
            while (n--) {
              u8arr[n] = bstr.charCodeAt(n)
            }
            return new Blob([u8arr], {type: mime})
          }
          if (file.size > 1024 * 1024) {
            photoCompress(file, {quality: 0.2}, (base64Codes) => {
              var bl = convertBase64UrlToBlob(base64Codes)
              formData.append('file', bl, 'file_' + Date.parse(new Date()) + '.jpg') // 文件对象
              this.uploadImg(formData)
            })
          } else {
            // append 文件
            formData.append('file', file)
            formData.append('tag', 'repair')
            // 上传图片
            this.uploadImg(formData)
          }
        },
        transformFileToDataUrl (file) {
          const formData = new FormData()
          // 自定义formData中的内容
    
          // append 文件
          formData.append('file', file)
          formData.append('tag', 'repair')
          // 上传图片
          this.uploadImg(formData)
        },
        // 上传图片
        uploadImg (formData) {
          const xhr = new XMLHttpRequest()
          // 进度监听
          // xhr.upload.addEventListener('progress', (e) => { console.log(e) }, false)
          // 加载监听
          // xhr.addEventListener('load', ()=>{console.log("加载中");}, false);
          // 错误监听
          const that = this
          xhr.addEventListener('error', () => {
            // debugger
            that.count--
          }, false)
    
          xhr.onreadystatechange = function () {
            if (xhr.readyState === 4) {
              const result = JSON.parse(xhr.responseText)
              if (xhr.status === 200 && result.code === 0) {
                // that.picData.push(result.data)
                // 上传成功
                that.uploadImgArr.push(result.data.url)
                console.log(result)
                Toast({
                  message: '图像上传成功',
                  className: 'hint-message'
                })
                console.log('上传头像成功')
              } else {
                // 上传失败
              }
            }
          }
    
          xhr.open('POST', process.env.API_HOME + '/file/upload', true)
          xhr.setRequestHeader('Authorization', window.localStorage.header_token)
          // xhr.open('POST','http://sandbox.gw.fdc.com.cn/homeworkstationapi/homeworkstationapi.restful.inter.img.batchupload',true)
          // xhr.open('POST', 'http://esf.basetest.fdc.com.cn/homeworkstation/homeworkstation.base.housesourceimg.batchupload', true)
          xhr.send(formData)
          that.changeimg = false
        },
  • 相关阅读:
    一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录
    MySQL复制表的方式以及原理和流程
    Python里面如何拷贝一个对象
    python中*args,**kwargs
    Python删除list里面的重复元素的俩种方法
    Python是如何进行内存管理
    python中lambda函数
    python中filter(),reduce()函数
    python中map()函数用法
    重磅发布:阿里开源 OpenJDK 长期支持版本 Alibaba Dragonwell
  • 原文地址:https://www.cnblogs.com/nanacln/p/9766355.html
Copyright © 2011-2022 走看看