基本的原理就是將圖片格式轉換成base64格式的,進行壓縮,然后再轉回固定格式的圖片文件,大的形式是以form表單形式進行后台交互的,但里面會new一個form和一個XMLHttpRequest對象,這樣可以彌補form表單提交文件沒有失敗返回的空缺,當限制使用jquery里的AjaxForm的時候,這也是一個很好的選擇。
var bl = convertBase64UrlToBlob(base64Codes); form.append("fileupload", bl, "file_"+Date.parse(new Date())+".jpg")
以下代碼是壓縮圖片的源碼,項目里面可以直接拿來復用的:
var xhr; var fileObj = document.getElementById("postPic").files[0]; // js 獲取文件對象 var url = ctx+'/ucenter/activityZp/uploadFileDataAjax';//后台接口地址 var form = new FormData(); // FormData 對象 form.append("act_id",id); form.append("studentIdAndSchoolId",studentId); //alert("原始大小===="+fileObj.size/1024); if(fileObj.size/1024 > 2048) { //大於2M,進行壓縮上傳 photoCompress(fileObj, { quality: 0.5//壓縮比例 }, function(base64Codes){ var bl = convertBase64UrlToBlob(base64Codes); form.append("fileupload", bl, "file_"+Date.parse(new Date())+".jpg"); xhr = new XMLHttpRequest(); // XMLHttpRequest 對象 xhr.open("post", url, true); //post方式,url為服務器請求地址,true 該參數規定請求是否異步處理。 xhr.onload = uploadComplete; //請求完成 xhr.onerror = uploadFailed; //請求失敗 xhr.send(form); //開始上傳,發送form數據 //alert("壓縮過") }); }else { photoCompress(fileObj, { quality: 1 }, function(base64Codes){ var bl = convertBase64UrlToBlob(base64Codes); form.append("fileupload", bl, "file_"+Date.parse(new Date())+".jpg"); xhr = new XMLHttpRequest(); // XMLHttpRequest 對象 xhr.open("post", url, true); //post方式,url為服務器請求地址,true 該參數規定請求是否異步處理。 xhr.onload = uploadComplete; //請求完成 xhr.onerror = uploadFailed; //請求失敗 xhr.send(form); //開始上傳,發送form數據 }); }
注意:代碼里面點擊input的時候,觸發選中照片以后,觸發以上的壓縮圖片事件,過程中會new FormData,生成另外一個input,如果同一張圖片上傳兩次,並且都失敗,這樣就會有可能觸發兩次交互,導致接口重復調用,以及第二次狀態提示框點擊事件失效,最好在第一次完成以后刷新當前頁面或者找方法銷毀這個formdata;
<div id="inputReset"> <input type="file" name="fileupload" accept="image/*" id="postPic" onchange="loadImg()"> </div>