下面透過文字說明和程式碼分析的方式跟大家分享行動端圖片上傳之localResizeIMG先壓縮後ajax無刷新上傳,具體實現過程請看下文。
現在科技太發達,行動裝置像素越來越高,隨便一張照片2M ,但要做行動端圖片上傳和pc上略有不同,行動端你不能去限制圖片大小,讓使用者先處理圖片再上傳,這樣不切實際。所以理解的解決方案就是在上傳先進行圖片壓縮,然後再把壓縮後的圖片上傳到伺服器。
一翻google之後,發現了localResizeIMG,它會對圖片進行壓縮成你指定寬度及質量度並轉換成base64圖片格式,那麼我們就可以把這個base64通過ajax傳到後台,再進行保存,先壓縮後上傳的目的就達成了。
處理過程
LocalResizeIMG壓縮圖片
AjaxPost圖片base64到後台
後台接收base64並儲存,返回狀態
前台代碼
重點,引用LocalResizeIMG.js(插件主體)及mobileBUGFix.mini.js(行動端的修補程式)
<!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提交部份
使用方法
$('input:file').localResizeIMG({ width: 400,//宽度 quality: 1,//质量 success: function (result) { result.base64/result.clearBase64 } });
localResizeIMG參數:
width:縮圖寬度
quality:圖片質量,0—1,有越大越好
localResizeIMG回傳值
result.base64:使用圖片類型的base64編碼,可直接用於img標籤的src,如「data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABA1/2P4AAQSkJRgABAQAAAQABA
result.clearBase64:不含圖片類型的編碼,如「/9j/4AAQSkZJRgABAQAAAQABAAD/…2wBDAAYEBQYFBAY」RgABAQAAAQABAAD/…2wBDAAYEBQYFBAY」
RgABAQAAAQABAAD/…2wBDAAYEBQYFBAY」RgABAQAAAQABAAD/…2wBDAAYEBQYFBAY」
RgABAQAAAQABAAD/…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); } }); } }); });
$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,圖片尺寸變大了,會失真),不知道大家有沒有什麼好的解決方法。 以上內容是本文介紹localResizeIMG先壓縮後使用ajax無刷新上傳的全部內容,希望大家喜歡。