圖片上傳前壓縮 lrz庫

以前手機微信端的項目由於圖片太大致使體驗十分不流暢,後來採用把上傳的圖片統一壓縮大小後解了燃眉之急。javascript

但這個方法的遺憾就是得等到圖片上傳後在服務器端壓縮,用戶若是上傳比較大的圖片耗時太大,並且也耗流量。php

關鍵是在用戶上傳前就把圖片壓縮了,現在找到了解決方法;java

用了lrz這個庫,http://www.jq22.com/jquery-info3419,感謝這個地址jquery

日常手機照片2M的圖通常能壓縮到150kb左右,效果明顯算法

首先引入三個庫文件數組

<script type="text/javascript" src="__TMPL__Vote/assets/js/mobileFix.mini.js" ></script>
<script type="text/javascript" src="__TMPL__Vote/assets/js/exif.js" ></script>
<script type="text/javascript" src="__TMPL__Vote/assets/js/lrz.js" ></script>

根據項目的不一樣使用不一樣的引入地址服務器

<input id="uploaderFile0" name="img[]" type="file"  data-add="0" onchange="changeFile(this)"/>

input:file框中使用時間onchang來觸發壓縮微信

var input = document.querySelector('input');
    lrz(obj.files[0], {width: 350}, function (results) {
            // 你須要的數據都在這裏,能夠以字符串的形式傳送base64給服務端轉存爲圖片。
            console.log(results);
            $("#img64base").val(results.base64);
             $(obj).remove();
        });

壓縮後是base64字符串,把該字符串放到一個隱藏的input裏,提交時只提交該字符串,刪除input:file;函數

<input type="hidden" name="img64base[]" id="img64base0" value="" />

多文件提交的是數組img64baseui

 

php對傳過來的字符串處理以下(多文件)

if($_POST['img64base'][0] !=""){
            
            //保存base64字符串爲圖片
            //匹配出圖片的格式
            foreach($_POST['img64base'] as $k=>$v){
                if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $v, $result)){
                  $type = $result[2];
                  $name=$this->fast_uuid();//圖片的命名函數
                  $new_file = "Public/Mun/vote/{$name}.{$type}";
                  if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $v)))){
                    //echo '新文件保存成功:', $new_file;
                    $data['add_img'][$k] = $name.'.'.$type; 
                  }
                }
            }
            $_POST['img']=implode(',',$data['add_img']);
        }else{
            //$_POST['img']="";
            $this->error('至少上傳一張圖片!');
        }

注意這個地方就能看懂

上傳過來的字符串前面多了data:image/jpeg;base64, 這幾個字,去掉以後才能使用base64_decode函數轉換成圖片內容,而後用file_put_contents函數把圖片能容放進一個圖片文件裏,注意圖片的後綴名也是從data:image/jpeg;base64中獲取的;

fast_uuid()是圖片的命名函數,從網上找的,以下
/*
* 參數 suffix_len指定 生成的 ID 值附加多少位隨機數,默認值爲 3。
* 感謝「Ivan Tan|譚俊青 DrinChing (at) Gmail.com」提供的算法。
* @param int suffix_len
* @return string
*/
private function fast_uuid($suffix_len=3){
        //! 計算種子數的開始時間
        $being_timestamp = time();

        $time = explode(' ', microtime());
        $id = ($time[1] - $being_timestamp) . sprintf('%06u', substr($time[0], 2, 6));
        if ($suffix_len > 0)
        {
            $id .= substr(sprintf('%010u', mt_rand()), 0, $suffix_len);
        }
        return $id;
    }
相關文章
相關標籤/搜索