移動端圖片上傳解決方案localResizeIMG先壓縮後ajax無刷新上傳

如今科技太發達,移動設備像素愈來愈高,隨便一張照片2M+,可是要作移動端圖片上傳和pc上略有不一樣,移動端你不能去限制圖片大小,讓用戶先處理圖片再上傳,這樣不現實。因此理解的解決方案就是在上傳先進行圖片壓縮,而後再把壓縮後的圖片上傳到服務器。javascript

一翻google以後,發現了localResizeIMG,它會對圖片進行壓縮成你指定寬度及質量度並轉換成base64圖片格式,那麼咱們就能夠把這個base64經過ajax傳到後臺,再進行保存,先壓縮後上傳的目的就達到了。php

處理過程

  1. LocalResizeIMG壓縮圖片
  2. AjaxPost圖片base64到後臺
  3. 後臺接收base64並保存,返回狀態

前臺代碼

重點,引用LocalResizeIMG.js(插件主體)及mobileBUGFix.mini.js(移動端的補丁)css

<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>移動端圖片上傳解決方案localResizeIMG先壓縮後ajax無刷新上傳</title>
<meta name="description" content="" />
<meta name="viewport" content="width=device-width , initial-scale=1.0 , user-scalable=0 , minimum-scale=1.0 , maximum-scale=1.0" />
<script type='text/javascript' src='js/jquery-2.0.3.min.js'></script>
<script type='text/javascript' src='js/LocalResizeIMG.js'></script>
<script type='text/javascript' src='js/patch/mobileBUGFix.mini.js'></script>
<style type="text/css">
  body{font-family:"微軟雅黑"}
  .uploadbtn{ display:block;height:40px; line-height:40px; color:#333; text-align:center; width:100%; background:#f2f2f2; text-decoration:none; }
  .imglist{min-height:200px;margin:10px;}
  .imglist img{width:100%;}
</style>
</head>
<body>
<div style="width:500px;margin:10px auto; border:solid 1px #ddd; overflow:hidden; ">
  <input type="file" id="uploadphoto" name="uploadfile" value="請點擊上傳圖片" style="display:none;" /> 
  <div class="imglist"></div> 
  <a href="javascript:void(0);" onclick="uploadphoto.click()" class="uploadbtn">點擊上傳文件</a>
</div>
<div style="text-align:center;margin-top:50px;">@ <a href="http://www.devdo.net/">碼農小兵,專一web開發 歡迎投稿</a></div> 
</body>
</html>

Js部份,localResizeIMG及Ajax提交部份

使用方法html

$('input:file').localResizeIMG({
      width: 400,//寬度
      quality: 1,//質量
      success: function (result) {
           result.base64/result.clearBase64
      }
});

localResizeIMG參數:java

  • width:縮略圖寬度
  • quality:圖片質量,0—1,越大越好

localResizeIMG返回值jquery

  • result.base64:帶圖片類型的base64編碼,可直接用於img標籤的src,如「data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/…2wBDAAYEBQYFBAY」;
  • result.clearBase64:不帶圖片類型的編碼,如「/9j/4AAQSkZJRgABAQAAAQABAAD/…2wBDAAYEBQYFBAY」
$(document).ready(function(e) {
   $('#uploadphoto').localResizeIMG({
      width: 400,
      quality: 1,
      success: function (result) {  
          var submitData={
                base64_string:result.clearBase64, 
            }; 
        $.ajax({
           type: "POST",
           url: "upload.php",
           data: submitData,
           dataType:"json",
           success: function(data){
             if (0 == data.status) {
                alert(data.content);
                return false;
             }else{
                alert(data.content);
                var attstr= '<img src="'+data.url+'" alt="" />'; 
                $(".imglist").append(attstr); 
             }
           }, 
            complete :function(XMLHttpRequest, textStatus){
            },
            error:function(XMLHttpRequest, textStatus, errorThrown){ //上傳失敗 
               alert(XMLHttpRequest.status);
               alert(XMLHttpRequest.readyState);
               alert(textStatus);
            }
        }); 
      }
  });
 
});

保存文件

在上面一步中,咱們把result.clearBase64經過Ajax傳入到upload.php中,接下來咱們就要在upload.php中接收base64參數,把它轉換成img文件保存來服務器中,並給出提示。web

 $base64_string = $_POST['base64_string'];
 
 $savename = uniqid().'.jpeg';//localResizeIMG壓縮後的圖片都是jpeg格式
 
 $savepath = 'images/'.$savename; 
 
 $image = base64_to_img( $base64_string, $savepath );
 
 if($image){
      echo '{"status":1,"content":"上傳成功","url":"'.$image.'"}';
 }else{
      echo '{"status":0,"content":"上傳失敗"}';
 } 
 
 function base64_to_img( $base64_string, $output_file ) {
     $ifp = fopen( $output_file, "wb" ); 
     fwrite( $ifp, base64_decode( $base64_string) ); 
     fclose( $ifp ); 
     return( $output_file ); 
 }

不足之處

  • localResizeIMG壓縮後的圖片模式都是jpeg,不能保證原有格式。
  • 當圖片寬度小於localResizeIMG設置的width參數時,圖片會被拉申,從而引發圖片失真(好比width高爲600,圖片只在400px時,壓縮後的圖片就變成了600px,圖片尺寸變大了,會失真),不知道你們有沒有什麼好的解決方法。

DEMO 下載

相關文章
相關標籤/搜索