源碼 ASP源碼 PHP源碼 NET源碼 JAVA源碼 FLASH源碼 其它源碼 整站源碼 常見問題

PHP+ajaxFileUpload 異步上傳文件插件

PHP源碼 HTML我幫您 1月前  次瀏覽

準備環境

jquery.js 
ajaxfileupload.js (資源下載地址:https://vdisk.weibo.com/s/C2-hAnBjUQqZ2


ajaxfileupload原理

原理:ajaxfileupload是通過監聽iframe的onload方法來實現, 當從服務端處理完成后,就觸發iframe的onload事件調用其綁定的方法,在綁定的方法中獲取iframe中服務器返回的數據體(支持的普通文本,json,xml,script, html)

語法:$.ajaxFileUpload([options])

參數說明:

1,url 上傳處理程序地址,也就是我發送給服務器端所要處理上傳的地址。

2,fileElementId 需要上傳的文件域的ID,即的ID。

3,secureuri 是否啟用安全提交,默認為false。

4,dataType 服務器返回的數據類型??梢詾閤ml,script,json,html。如果不填寫,jQuery會自動判斷。

5,success 提交成功后自動執行的處理函數,參數data就是服務器返回的數據。

6,error 提交失敗自動執行的處理函數。

7,data 自定義參數。這個很有用,比如你上傳圖片的同時想把圖片名也一起傳過去,可以用這個參數去實現。

8,type 當要提交自定義參數時,這個參數要設置成post



接下來我們看看如何去使用

靜態頁面的代碼

<div class="form-group">
   <label for="firstname" class="col-sm-1 control-label">身份證正面</label>
    <div class="col-sm-2">
     <label for="inputfile"></label>

    <input type="hidden" id="headImg"/>

    <input type="file" id="headImgUpload" name="headImgUpload"/><br/>
       <label class="control-label" for="headImgUpload" style="display: none;"></label>
        <p class="help-block"><img class="img-rounded" src="#" width="100" height="100" id="img1" alt="請上傳身份證正面"  /></p>
        </div>
  </div>

引入js代碼

ajaxHeardImgUpload.js文件如下

$(document).ready(function(){
    //解決file的change事件只能執行一次的問題
    $(document).on('change','#headImgUpload',function(){
        ajaxHeadImgUpload();

    });
});


//上傳圖片的方法,
function ajaxHeadImgUpload(){
    //調用ajaxfileupload.js中的方法
    $.ajaxFileUpload({
        url:'/MyBlog/index.php?p=back&c=Uploader&a=uploaderHead',//上傳圖片要提交到的PHP后臺Action方法
        secureuri:false,//是否用安全提交,默認為false
        fileElementId:'headImgUpload',//file選擇文件的框的id
        dataType:'json',//數據返回格式,如果用json,需要修改ajaxfileupload.js中的內容 eval("data = " + data ); -->data = jQuery.parseJSON(jQuery(data).text());
        success: function (data){
            if(data.success){
                //獲得json格式數據的值,并轉換顯示圖片在頁面上
                 $("#img1").attr("src",data.path);
                 $("#headImg").val(data.path);

            }
            showInfo(data.info);
        },
        error: function(data, status, e){   //提交失敗自動執行的處理函數
            alert(e);
        }
    });
}


function showInfo(msg) {
    $("#div_info").text(msg);
    $("#modal_info").modal('show');
}

PHP中的處理上傳的代碼

<?php
/**
 * Created by PhpStorm.
 * User: c
 * Date: 2017/4/17
 * Time: 9:03
 */

class UploaderController extends BaseController {


    //上傳頭像方法
    public function uploaderHeadAction(){
        $fileName = "headImgUpload";
        $this->uploader($fileName);

    }

    //上傳微信二維碼方法
    public function uploaderWeChatAction(){
        $fileName = "wechatImgUpload";
        $this->uploader($fileName);

    }




    public function uploader($fileName) {
        $files = array();
        $files['name'] = $_FILES[$fileName]['name'];   //上傳圖片的原名字
        $files['info'] = ""; //和該文件上傳相關的信息
        $files['size'] = $_FILES[$fileName]['size'];   //已上傳文件的大小,單位為字節
        $files['type'] = $_FILES[$fileName]['type'];   //文件的 MIME 類型,需要瀏覽器提供該信息的支持,例如"image/gif"
        $files['success'] = false;            //這個用于標志該圖片是否上傳成功
        $files['path'] = '';                //存圖片路徑

        //:0:表示沒有發生錯誤
        if($_FILES[$fileName]['error']==0){
            //is_uploaded_file — 判斷文件是否是通過 HTTP POST 上傳的
            if(is_uploaded_file($_FILES[$fileName]['tmp_name'])) {
                    //擴展名
                 $extension = '';
                 //strcmp — 二進制安全字符串比較 (區分大小寫)
               // 如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果兩者相等,返回 0。
                 if(strcmp($_FILES[$fileName]['type'], 'image/jpeg') == 0) {
                     $extension = '.jpg';
                  }else if(strcmp($_FILES[$fileName]['type'], 'image/png') == 0) {
                     $extension = '.png';
                  }else if(strcmp($_FILES[$fileName]['type'], 'image/gif') == 0) {
                     $extension = '.gif';
                 }else{
                     //如果type不是以上三者,我們就從圖片原名稱里面去截取判斷去取得(處于嚴謹性)
                     //strrchr — 查找指定字符在字符串中的最后一次出現
                     $substr = strrchr($_FILES[$fileName]['name'], '.');
                     if(FALSE != $substr) {
                         $files['info'] = "文件類型有誤";
                     }
                      //strcasecmp — 二進制安全比較字符串(不區分大小寫),比較字符串是否相同
                     //如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果兩者相等,返回 0。
                     //取得原名字的擴展名后,再通過擴展名去給type賦上對應的值
                     if(strcasecmp($substr, '.jpg') == 0 || strcasecmp($substr, '.jpeg') == 0 || strcasecmp($substr, '.jfif') == 0 || strcasecmp($substr, '.jpe') == 0 ) {
                         $files['type'] = 'image/jpeg';
                     }else if(strcasecmp($substr, '.png') == 0) {
                         $files['type'] = 'image/png';
                     } else if(strcasecmp($substr, '.gif') == 0) {
                         $files['type'] = 'image/gif';
                     }else {
                         $files['info'] = "上傳的文件類型不符合";
                     }
                     $extension = $substr;//賦值擴展名

                 }

                 if(trim($files['info'])==""){
                    //對臨時文件名加密,用于后面生成復雜的新文件名
                    $md5 = md5_file($_FILES[$fileName]['tmp_name']);
                    //取得圖片的大小
                    //getimagesize() 函數將測定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM
                    // 或 WBMP 圖像文件的大小并返回圖像的尺寸以及文件類型
                    //和一個可以用于普通 HTML 文件中 IMG 標記中的 height/width 文本字符串。
                    $imageInfo = getimagesize($_FILES[$fileName]['tmp_name']);
                    $rawImageWidth = $imageInfo[0];
                    $rawImageHeight = $imageInfo[1];
                    //設置圖片上傳路徑,放在upload文件夾,以年月日生成文件夾分類存儲,

                    $path = ROOT . 'upload\\' . @date("Ymd"). '\\';
                    ///確保目錄可寫
                    if($this->ensure_writable_dir($path)){
                        ////文件名
                        $name = "$md5.0x{$rawImageWidth}x{$rawImageHeight}{$extension}";
                        //加入圖片文件沒變化到,也就是存在,就不必重復上傳了,不存在則上傳
                        $ret = file_exists($path . $name) ? true : move_uploaded_file($_FILES[$fileName]['tmp_name'], $path . $name);
                        if ($ret === false) {
                            $files['info'] = "上傳失敗";
                        } else {
                            $files['path'] = "\\MyBlog\\upload\\" . @date("Ymd"). '\\'. $name;        //存圖片路徑
                            $files['success'] = true;            //圖片上傳成功標志
                            $files['width'] = $rawImageWidth;    //圖片寬度
                            $files['height'] = $rawImageHeight;    //圖片高度
                            $files['info'] = "上傳成功";//寫入成功
                        }
                    }else{
                        $files['info'] = "目錄不可寫";//目錄不可寫
                    }
                 }

            }else{
                $files['info'] = "上傳失敗";//上傳失敗
            }

        }


        echo json_encode(array(
            'success' =>  $files['success'],
            'path' => $files['path'],
            'info'=>$files['info'],
         ));
    }


    /**
     * 判斷是否可寫
     * @param $dir
     * @return bool
     */
    function ensure_writable_dir($dir) {
        if(!file_exists($dir)) {
            mkdir($dir, 0766, true);
            chmod($dir, 0766);
            chmod($dir, 0777);
        }
        else if(!is_writable($dir)) {
            chmod($dir, 0766);
            chmod($dir, 0777);
            if(!is_writable($dir)) {
               return false;
            }
        }
        return true;
    }


}

最后就可以看到上傳結果了



相關鏈接

發表評論

2017怎样手机上赚钱