使用ajax上傳圖片,支持圖片即時瀏覽,支持js圖片壓縮后上傳給服務器
ajax上傳主要使用了 var reader = new FileReader() 此方法
js圖片壓縮主要是利用canvas進行的
源碼:
/** * js使用form上傳圖片,支持本地預覽選中的圖片,支持攜帶自定義參數 * @param {string} params.previewImgId 預覽圖片控件id,可以預覽上傳圖片 * @param {string} params.url 提交上傳的url * @param {function} params.success 上傳接口的回調函數 * @param {boolean} params.params 上傳時提交的其它參數 有幾個傳幾個,系統會把 previewImgId url success 這三個參數過濾后的其它參數傳給服務器 使用示例: <img src="" id="yulan"> <div onclick="shangchuan()">上傳</div> function shangchuan(){ jsUploadImage({"diyparam":"1111","diyparam1":"222","previewImgId":"yulan","url":"user.php?act=photosave","success":function(data){ console.log(data); }}) }; */ function jsUploadImage(params){ //初始化數據 params.previewImgId = params.previewImgId || ""; params.url = params.url || ""; params.success = params.success || ""; //創建file上傳控件 if(document.getElementById("imgFile")==null){ var inputEle=document.createElement("input"); //創建input inputEle.id="imgFile"; inputEle.type="file"; inputEle.accept="image/png,image/jpeg,image/jpeg,DCIM/*;capture=camera"; inputEle.style="display:none;"; inputEle.onchange = function(){ showPhoto() }; inputEle.multiple = false; document.body.appendChild(inputEle); } var imgFile = document.getElementById("imgFile"); imgFile.click(); //選中文件后的預覽圖片 function showPhoto(){ //文件對象 var file = document.getElementById("imgFile").files[0]; //讀取后輟,判斷是否允許的文件 var fileSuffix = file.name.substring(file.name.length-4); var allowFile = ".jpg|.png|.gif"; if(allowFile.indexOf(fileSuffix.toLowerCase())==-1) { alert("請使用"+allowFile+"后輟的文件"); return false; } //如果傳了顯示控件的id,顯示本地預覽 var reader = new FileReader() reader.readAsDataURL(file); reader.onload = function(e){ var imgBase64Data = e.target.result; //顯示預覽 if("" != params.previewImgId) document.getElementById(params.previewImgId).src = imgBase64Data; //如果不壓縮直接上傳 //savePhoto(imgBase64Data) //對圖片進行縮小處理,然后再上傳 compressPhoto(imgBase64Data,1000,1000,function(imgBase64DataBack){ //提交服務保存數據 savePhoto(imgBase64DataBack) }); } } //提交數據 function savePhoto(base64Data){ var formData = new FormData(); //加入其它參數 for(var key in params){ if(key!="previewImgId" && key!="url" && key!="success" ){ formData.append(key, params[key]); } } //加入文件參數 利用base64 formData.append("imgFile",encodeURIComponent(base64Data)); //加入文件參數 file控件上傳 , 但這種試就不支持對圖片壓縮了,所以手機端不采用這種方式 //formData.append('imgFile', file); //ajax上傳 $.ajax({ url:params.url, type: 'POST', cache: false, dataType:"json", data: formData, processData: false, contentType: false }).done(function(res) { if(params.success!=""){ params.success(res); } }).fail(function(res) { alert("上傳失敗"); }); } } /** * js利用canvas對圖像進行壓縮處理 * @param {string} imgBase64Data 圖像base64數據 * @param {string} maxWidth 最大高度 * @param {function} maxHeight 最大寬度 * @param {boolean} fun 回調函數,參數為處理后的圖像數據 使用示例: compressPhoto(imgBase64Data,maxWidth,maxHeight,function(imgBase64Data){ //返回圖片數據后的處理 }) */ function compressPhoto(imgBase64Data,maxWidth,maxHeight,fun){ var img = new Image(); // 縮放圖片需要的canvas var canvas = document.createElement('canvas'); var context = canvas.getContext('2d'); // base64地址圖片加載完畢后 img.onload = function () { // 圖片原始尺寸 var originWidth = this.width; var originHeight = this.height; // 目標尺寸 var targetWidth = originWidth, targetHeight = originHeight; // 圖片尺寸超過400x400的限制 if (originWidth > maxWidth || originHeight > maxHeight) { if (originWidth / originHeight > maxWidth / maxHeight) { // 更寬,按照寬度限定尺寸 targetWidth = maxWidth; targetHeight = Math.round(maxWidth * (originHeight / originWidth)); } else { targetHeight = maxHeight; targetWidth = Math.round(maxHeight * (originWidth / originHeight)); } } // canvas對圖片進行縮放 canvas.width = targetWidth; canvas.height = targetHeight; // 清除畫布 context.clearRect(0, 0, targetWidth, targetHeight); // 圖片壓縮 context.drawImage(img, 0, 0, targetWidth, targetHeight); var base=canvas.toDataURL("image/jpeg",0.7);//canvas轉碼為base64 fun(base);//返回處理 }; img.src = imgBase64Data; }
使用示例:
<img src="" id="yulan"> <div onclick="shangchuan()">上傳</div> <script type="text/javascript"> function shangchuan(){ jsUploadImage({"diyparam":"1111","diyparam1":"222","previewImgId":"yulan","url":"user.php?act=photosave","success":function(data){ console.log(data); }}) }; </script>
來源:jsfun.cn
http://www.jsfun.cn/#codecollect