FileReader

news/2024/7/10 3:02:18 标签: vue, 图片压缩, FileReader, dataUrl

FileReader就是html5为我们提供的读取文件的api。
它的作用就是把文本流按指定格式读取到缓存,以供js调用。

FileReader有五种方法:
    1.abort()
        该方法可以取消 FileReader 的读取操作,触发之后 readyState 为已完成
    2.readAsArrayBuffer()
        用于启动读取指定的 Blob 或 File 内容。
        当读取操作完成时,readyState 变成 DONE
        并触发 loadend 事件,同时 result 属性中将包含一个 ArrayBuffer 对象以表示所读取文件的数据。
    3.readAsBinaryString()  非正式环境使用
        读取指定的 Blob 或 File 对象,当读取完成的时候,readyState  会变成DONE
        并触发 loadend 事件,同时 result 属性将包含所读取文件原始二进制格式。
    4.readAsDataURL()
        读取指定的 Blob 或 File 对象。
        读取操作完成的时候,readyState 会变成已完成
        并触发 loadend 事件,同时 result 属性将包含一个data:URL格式的字符串(base64编码)以表示所读取文件的内容。
    5.readAsText()
        将 Blob 或者 File 对象转根据特殊的编码格式转化为内容(字符串形式)
        这个方法是异步的,只有当执行完成后才能够查看到结果,如果直接查看是无结果的,并返回undefined
        必须要挂载 实例下的 onload 或 onloadend 的方法处理转化后的结果
        当转化完成后, readyState 这个参数就会转换 为 done 即完成态,
        event("loadend") 挂载的事件会被触发,并可以通过事件返回的形参得到中的 FileReader.result 属性得到转化后的结果

 

DataURL固定格式:
    data:[文件格式];base64,[文本流base64编码]。
    

检测浏览器对FileReader的支持
    if (window.FileReader) {
      console.log('support')
      var fileReader = new FileReader()
    } else {
      console.log('not support')
    }


根据input框获取File对象,通过FileReader对File对象进行处理:
    选文件input标签:                                <input type="file" ref="chooseFile" @change="onChange" value="choose"/>
    file对象:                                        this.$refs['chooseFile'].files[0]
    FileReader对File对象读取成DataUrl格式数据:     fileReader.readDataURL(this.$refs['chooseFile'].files[0])
    通过readAsDataUrl读取文件后,获取DataUrl数据:    fileReader.onload = function() { let dataUrl = fileReader.result }
    fileReader.reuslt数据可以直接放入img.src中作为图片本地路径预览图片
    如果需要对图片进行压缩,可以对fileReader.result指向的dataUrl数据进行压缩处理
    最后将压缩的dataUrl数据转换为blob格式数据进行上传


图片压缩demo

<template>
  <div>
    <input type="file" ref="chooseFile" @change="onChange" value="choose"/>
    <img :src="imgSrc" style="width:100px;height:100px;border:1px solid red;" ref="imgs"/>
  </div>
</template>
<script>
export default {
  data () {
    return {
      imgSrc: '',
      // 用户id
      userId: '',
      // 上传url
      actionUrl: ''
    }
  },
  methods: {
    onChange (event) {
      if (window.FileReader) {
        console.log('support FileReader')
        console.log('event', event)
        console.log('file', this.$refs['chooseFile'].files[0])
        let file = this.$refs['chooseFile'].files[0]
        let imgs = this.$refs['imgs']
        let fileReader = new FileReader()
        let localThis = this
        fileReader.readAsDataURL(file)
        fileReader.onload = function () {
          let img = new Image()
          img.src = fileReader.result
          console.log(fileReader.result.length)
          console.log('img', img)
          img.onload = function () {
            // 图片压缩
            let data = localThis.compress(img)
            // dataUrl转bolb数据
            let bolb = localThis.dataURItoBlob(data)
          }
        }
        console.log('content', content)
      } else {
        console.log('do not support FileReader')
      }
    },
    // 图片压缩
    compress (img) {
      let canvas = document.createElement("canvas")
      let ctx = canvas.getContext("2d")
      let initSize = img.src.length
      let width = img.width
      let height = img.height
      canvas.width = width
      canvas.height = height
      // 铺底色 这个步骤是必须的,只有将imgage绘制在canvas才能压缩
      ctx.fillStyle = "#fff"
      ctx.fillRect(0, 0, canvas.width, canvas.height)
      ctx.drawImage(img, 0, 0, width, height)
      //进行最小压缩
      let ndata = canvas.toDataURL("image/jpeg", 0.1);
      // console.log("*******压缩后的图片大小*******");
      // console.log(ndata)
      console.log(ndata.length);
      return ndata;
    },
    // dataUrl 转 blob
    dataURItoBlob (base64Data) {
      var byteString;
      if (base64Data.split(",")[0].indexOf("base64") >= 0) {
        byteString = atob(base64Data.split(",")[1])
      } else {
        byteString = unescape(base64Data.split(",")[1])
      }
      var mimeString = base64Data
        .split(",")[0]
        .split(":")[1]
        .split(";")[0]
      var ia = new Uint8Array(byteString.length)
      for (var i = 0; i < byteString.length; i++) {
        ia[i] = byteString.charCodeAt(i)
      }
      return new Blob([ia], { type: mimeString })
    },
    // dataUrl 抓 blob第二种写法
    dataURItoBlob2 () {
      let arr = dataURI.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})
    },
    // 图片上传
    uploadPic (blob, fileName) {
      let config = {
        headers: {'Content-Type': 'multipart/form-data'}
      }
      let formData = new FormData()
      formData.append('file', blob, fileName)
      formData.append('userId', this.userId)
      axios.post(this.actionUrl, formData, config)
        .then((res) => {
          if (res.flag === 'true') { console.log('上传成功!') }
        })
        .catch((error) => { console.log('错误:' + error )})
    }
  }
}
</script>
<style lang="less" scoped>

</style>

 


http://www.niftyadmin.cn/n/1162564.html

相关文章

DataURL与File,Blob,Canvas之间的互相转换

DataURL: 数据格式的url,src可以直接指向dataURL用来显示图片。 图片被转换成base64编码的字符串形式&#xff0c;并存储在URL中&#xff0c;冠以mime-type。 Bolb: 是一种javascript对象类型&#xff0c;可以存储大量二进制数据 HTML5的文件操作对象&…

SpringMVC 第五章 RequestParam

获取请求正文 Spring MVC 通过分析处理方法的签名&#xff0c;将Http请求信息绑定到处理方法的相应入参中。 Spring MVC 对控制器处理方法签名的限制是很宽松的&#xff0c;可以按任何方式对方法进行签名。 必要时可以对方法及方法入参标注相应的注解&#xff1a; …

同步、异步、阻塞、非阻塞、回调函数

同步&#xff1a; 执行一个操作之后&#xff0c;等待结果&#xff0c;然后才继续执行后续的操作。 异步&#xff1a; 执行一个操作后&#xff0c;可以去执行其他的操作&#xff0c;然后等待通知再回来执行刚才没执行完的操作。 阻塞&#xff1a; 进程给CPU传达一个任务之后&…

vue 引入依赖的方法

1.网络引用 1.1 在vue的入口页面index.html中引入网络文件 例如&#xff1a; <script type"text/javascript" src"http://api.map.baidu.com/api?v2.0&ak您的密钥"></script> 1.2 在根目录下的build/webpack.b…

SpringMVC 第六章 模型数据

Spring MVC 提供了以下几种途径输出模型数据 1.ModelAndView: 处理方法返回值类型为ModelAndView时&#xff0c;方法体即可通过该对象添加模型数据 既包含视图信息&#xff0c;也包含模型数据信息。 ModelAndView中包含两个添加数据模型的方法&#xff1a; …

es6 Async / Await

async/awaitf这种特殊的语法可以更舒适地与promise协同工作。 async-await是promise和generator的语法糖。 async-await 是建立在 promise机制之上的&#xff0c;并不能取代其地位。 Async的使用&#xff1a; 使用方法&#xff1a; 放置在函数的前面&#xff1a;async fu…

vuex Action

Action 类似于 mutation&#xff0c;不同在于&#xff1a; 注意&#xff1a;Action&#xff1a;可以异步&#xff0c;但不能直接操作State。操作state的方法全部依靠commit mutation完成 Action 提交的是 mutation&#xff0c;而不是直接变更状态。 Action…

vuex 实战 模板可套用 格式可套用

vuex.vue format: import { resolve } from "dns"; import { reject } from "q";const test {// 共享数据源 datastate: {userinfo: {},userList: [],departmentInfo: {},departmentList: [],sum: 0,substract: 0,multiply: 0,divide: 0,countPartA: 0,c…