使用ajax上傳圖片,支持圖片即時瀏覽,支持js圖片壓縮后上傳給服務器


使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM