須知知識點:
- FileReader()對象
- Image()對象
- upload組件
有一個需求,需要判斷上傳的圖片的寬高,限制800*800像素大小,用的是ant-design-vue框架。
1.原生的input type="file"判斷圖片大小的方法如下:
HTML:
<input type="file" id="img"> <h1 id="h1"></h1>
JS:
1 img.onchange=function(e){ 2 // e.target.files[0]表示選取的第一個文件 3 console.log(e.target.files[0]); 4 // FileReader對象將文件讀取為dataURL格式 5 let reader=new FileReader(); 6 reader.readAsDataURL(e.target.files[0]), 7 // load事件在讀取操作結束的時候觸發 8 reader.onload=()=>{ 9 const img=new Image(); 10 // FileReader.result返回文件的內容。只有在讀取操作完成后,此屬性才有效,返回的數據的格式取決於是使用哪種讀取方法來執行讀取操作的。 11 img.src=reader.result; 12 // 如果此時直接獲取img的寬高結果是0,只有當圖片加載結束以后(load)獲取才能獲取到 13 img.onload=()=>{ 14 let w=img.width; 15 let h=img.height; 16 h1.innerHTML=`寬:${w}-高${h}` 17 } 18 } 19 }
2.ant-design-vue中使用upload組件中獲取圖片大小的方式如下:
template:
<a-upload accept="image/jpg,image/jpeg,image/png" action="https://www.mocky.io/v2/5cc8019d300000980a055e76" list-type="picture-card" :file-list="imgList" @preview="handlePreview" @change="handleChange" :beforeUpload="beforeUpload" > </a-upload>
開始在handleChange方法中判斷img文件,它傳入的是一個已經選擇文件的列表,他的內容如下:
如果直接用這個列表中單個元素來執行上述圖片判斷,則會報錯:
原生js中的input type="file"打印出來e.target.files[0]結構如下:
這就是讀取失敗的原因,展開ant-design-vue中的originFileObj屬性,發現原生file的內容被放到這里了:
而且再把beforeUpload文件上傳前鈎子函數中的默認傳入的參數file打印出來發現就是原生input type="file"的內容,所以直接在beforeUpload鈎子函數中直接判斷圖片的width和height中即可。
1 // 上傳文件之前的鈎子 2 beforeUpload(file){ 3 console.log("beforeUpload中:",file); 4 let reader = new FileReader(); 5 reader.readAsDataURL(file); 6 reader.onload=()=>{ 7 const image=new Image(); 8 image.src=reader.result; 9 image.onload=()=>{ 10 let w=image.width; 11 let h=image.height; 12 console.log("寬高:",w,h); 13 } 14 } 15 return false; 16 }