1.文件的上传主要是基于<ipt type="file">的属性 点击(点击行为则是通过在ipt上绑定ref=“名字”属性获取元素,然后在点击的时候$refs.名字.click()去模拟点击)之后就可以上传文件了
注意:需要把利用ipt的hidden属性将ipt框隐藏起来,不让其在页面展示
其中accept属性是允许接收的文件类型,multiple允许传入多个文件。
2.如何获取选择以后的图片的值,通过给ipt绑定change事件监视变化,进而去获取我们传入图片的值(但是不要使用.value,因为不同的操作系统可能会出现错误)一般使用元素本身的files伪数组(this.$refs.名字.files[0]),获得的二进制对象。
3.当我们得到二进制对象以后,我们要知道(我们编辑图片的位置)图片的src属性只能识别两种类型 正常的src和Base64所以我们要将我们得到的二进制对象转换成Base64编码格式。
4.如何将二进制对象----->Base64 就要利用JS中的文件阅读器(FileReader)他是一个构造函数 使用的话创建即可。(示例如下)
eg:
1.const fr = new FileReader()
2.fr.readAsDataURL(file)传入要读取的二进制对象
3.由于其是异步操作 所以接收结果需要
Fr.onload = (e)=>{ e.target.result} 其中 e.target.result就是得到的Base64
由于上述代码,复用性不高,因此可以将我们转换的过程抽离出来单独封装成一个函数,使用时直接导入调用即可 封装如下
异步调用即可
过程中会遇到两个bug
第一个是:当你选中了一张图片然后你又选中它的时候
不能够选中这时候只需要将ipt的value置空即可 this.$refs.名字.value=‘’
第二个是:当你选中一张图片时选中其他的 会被原来的图片遮住,这是因为我们剪裁插件的原因,只需要通过v-if让上传图片的组件销毁再创建就行
关于剪裁图片的插件的使用 网址:cropperjs实践及中文文档(自译) - 灭灭 - 博客园 (cnblogs.com)
插件使用: