# 如何在上传图片时限制宽高/尺寸--JavaScript
# 实现代码
// 代码不能直接使用,使用前请自行优化调整
uploadImage(e) {
// let event = e || window.event // 如有需要,这里也考虑一下event的兼容
let file = e.file
let reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = function(data) { // 注意要在onload事件之后再执行后续操作
let result = data.target.result
let image = new Image() // new 一个 image对象
image.src = result // 将转换的文件流赋值到 src 属性
image.onload = function() {
let width = this.width
let height = this.height
if(width === 1080 && height === 1920) {
alert('上传的图片尺寸错误,请重新上传!')
}
}
}
}
获取图片宽高的关键代码就是上面部分。
# 实现思路
将 file 对象转换成 base64 数据,实例化 image 对象并将 base64 数据数据赋值到 image 的 src 属性(图片预加载的原理),借助 image 的 onload 事件,在图片加载完成时,通过 width 和 height 属性获取宽高
下面是一些相关理解及相关知识的扩展,请酌情食用
# 扩展
# File 对象
需要获取图片相关的数据,第一步肯定是需要先获取到 file 对象。上传文件的数据都被包含在 file 对象中
<input type="file" id="uploadFile" />
在原生 input 中,我们可以通过 change 事件来获取上传的 file 对象,如果用其他组件或库会有所不同,如:Element UI (opens new window),可以通过 on-change
钩子拿到 file 对象
let fileObj = document.getElementById("uploadFile")
fileObj.onchange = function(e) {
let file = e.target.files[0]
}
# FileReader 对象
FileReader 对象允许 Web 应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。
重要提示: FileReader 仅用于以安全的方式从用户(远程)系统读取文件内容 它不能用于从文件系统中按路径名简单地读取文件。 要在 JavaScript 中按路径名读取文件,应使用标准 Ajax 解决方案进行服务器端文件读取,如果读取跨域,则使用 CORS 权限。
fileReader 一般有以下四种方法,可以将文件流转换成其他我们需要的格式,其转换结果已经被包含在它的 result 属性里:
readAsArrayBuffer | readAsBinaryString | readAsDataURL | readAsText |
---|---|---|---|
读取完成后,返回的是被读取文件的 ArrayBuffer 数据对象 | 读取完成后,返回的是被读取文件的原始二进制数据 | 读取完成后,返回的对象将会是一个 data: URL 格式的 Base64 字符串 | 读取完成后,返回的将会是字符串 |
转换完成后(通过 onload 事件判断),我们可以通过 e.target.result
来获取,这样就可以赋值到 image 对象的 src 属性了。
# Image 对象
在使用 new Image()
创建 image 对象时,Image 对象将会创建一个新的 HTMLImageElement 实例,它的功能等价于 document.createElement('img')
,因此,我们可以通过实例化的 image 对象来获取它的宽高属性。此外 Image() 也有两个可选参数:width 宽度和 height 高度,在其他需要的场景下可以设置图片的宽高
# 参考文档
FileReader -- MDN 文档 (opens new window)
Image --MDN 文档 (opens new window)