jquery 中 ajax

完整文檔

ajax 調用

html 

<input type="file" multiple  id="files">
<button onclick="jqueryAjax2()">上傳文件s</button>
<p id="files_progress" style="width:0px; height: 10px; background-color: #0e90d2"></p>

js 

function jqueryAjax2() {

        var fd = new FormData();
        // 上傳單個、多個文件數據
        var file_data = $("input[type='file']")[0].files;
        console.log(file_data)
        // 如果直接寫 formData.append("server_files", files); 後端接收不到 server_files
        for (var i = 0; i < file_data.length; i++) {
            fd.append("files["+i+"]", file_data[i]);
        }
        // 發送數據
        fd.append('id',34);
        fd.append('name','abc');
        fd.append('char','中文字符');
        // 請求地址
        var url = "http://casphp.com/api/AjaxRequest/jqueryAjax2";
        // 設置 header
        var header={
            "Authorization":"token_value"
            // ,"Cookie":"cookie_name=cookie_value" //  w3c 不允許設置cookie
        };

        // 發送請求
        $.ajax({
            type:"POST",
            url:url,
            data:fd,
            // dataType設置你收到服務器數據的格式
            dataType:"JSON",
            //默認情況下(值爲true)會將發送的數據序列化以適應默認的內容類型application/x-www-form-urlencoded;
            //如果想發送不想轉換的的信息的時候需要手動將其設置爲false
            processData: false,  // 表示不讓jQuery將fd對象處理成字符串,應該直接使用fd對象
            //contentType 主要設置你發送給服務器的格式,上傳的是文件,這裏設置爲false
            //contentType都是默認的值:application/x-www-form-urlencoded,這種格式的特點就是,name/value 成爲一組,每組之間用 & 聯接,而 name與value 則是使用 = 連接。參數形式: key=fdsa&lang=zh
            contentType: false,  //使用FormData時不能設置Content-Type,讓FormData自己處理,所以改成false
            // 添加header 信息
            headers:header,
            //  默認情況下,標準的跨域請求是不會發送cookie的,攜帶瀏覽器已存在的cookie
            xhrFields: {
                withCredentials: true
            },
            //如果 跨域請求 攜帶不過去去 withCredentials:true,可以使用下面的方法
            beforeSend:function(xhr){
                xhr.withCredentials = true;
                // 也可以在這裏定義header
                xhr.setRequestHeader('XX-Device-Type', 'extra_head_data');
                console.log('請求開始');
            },
            // 上傳進度條,不是真實上傳到服務端數據
            xhr: function () {
                var xhr = new XMLHttpRequest();
                //使用XMLHttpRequest.upload監聽上傳過程,註冊progress事件,打印回調函數中的event事件
                xhr.upload.addEventListener('progress', function progressFn(e) {
                    //e.total代表總數爲多少,e.loaded代表上傳了多少
                    var progressPercent = Math.round((e.loaded / e.total) * 100,-2) + '%';
                    $('#file_progress').width(progressPercent).html(progressPercent);
                    if(e.loaded == e.total){
                        xhr.upload.removeEventListener('progress',progressFn,false)
                    }
                },false);
                return xhr;
            },
            success: function(data,statu,response){
                if(data.code==1){
                    console.log(data.data);
                }else{
                    console.log(data.msg);
                }
            },
            complete:function () {
                console.log('請求完成');
            },
            error: function(xhr,status,errorinfo) {
                console.log(status,errorinfo)
            }
        });
    }

promise 封裝 ajax

 html

<input type="file" multiple  id="filess">
<button onclick="jqueryAjax3()">上傳文件ss</button>
<p id="filess_progress" style="width:0px; height: 10px; background-color: #0e90d2"></p>

 js 封裝爲 Promise 函數

function promiseAjax(method,url,data,header){
    return new Promise(function(resolve, reject){
        $.ajax({
            type: method,
            url: url,
            data:data,
            // 表示不讓 jQuery 將 formData 對象處理成字符串,應該直接使用 formData 對象
            processData: false,
            // 使用 FormData 時不能設置 Content-Type,讓 FormData 自己處理,所以改成false
            contentType: false,
             headers:header,
            //  默認情況下,標準的跨域請求是不會發送cookie的,攜帶瀏覽器已存在的cookie
            xhrFields: {
                withCredentials: true
            },
            //如果 跨域請求 攜帶不過去去 withCredentials:true,可以使用下面的方法
            beforeSend:function(xhr){
                xhr.withCredentials = true;
                // 也可以在這裏定義header
                xhr.setRequestHeader('XX-Device-Type', 'extra_head_data');
                console.log('請求開始');
            },
            dataType: 'json',
            // 上傳進度條,不是真實上傳到服務端數據
            xhr: function () {
                var xhr = new XMLHttpRequest();
                //使用XMLHttpRequest.upload監聽上傳過程,註冊progress事件,打印回調函數中的event事件
                xhr.upload.addEventListener('progress', function progressFn(e) {
                    //e.total代表總數爲多少,e.loaded代表上傳了多少
                    var progressPercent = Math.round((e.loaded / e.total) * 100,-2) + '%';
                    $('#filess_progress').width(progressPercent).html(progressPercent);
                    if(e.loaded == e.total){
                        xhr.upload.removeEventListener('progress',progressFn,false)
                    }
                },false);
                return xhr;
            },
            success: function(res) {
                if(res.code==1){
                    // 成功則返回數據
                    resolve(res.data)
                }else{
                    reject('服務端請求失敗返回信息')
                }

            },
            error:function(err){
                reject('請求錯誤信息:'+err.status+' '+err.statusText)
            },
            complete:function () {
                console.log('請求完成')
            }
        })
    })
}

調用 promiseAjax

function jqueryAjax3() {
        var fd = new FormData();
        // 上傳單個、多個文件數據
        var file_data = $("input[type='file']")[0].files;
        console.log(file_data);
        // 如果直接寫 formData.append("server_files", files); 後端接收不到 server_files
        for (var i = 0; i < file_data.length; i++) {
            fd.append("files["+i+"]", file_data[i]);
        }
        // 發送數據
        fd.append('id',34);
        fd.append('name','abc');
        fd.append('char','中文字符');
        // 請求地址
        var url = "http://casphp.com/api/AjaxRequest/jqueryAjax2";
        // 設置 header
        var header={
            "Authorization":"token_value"
            // ,"Cookie":"cookie_name=cookie_value" //  w3c 不允許設置cookie
        };
        // 調用示例
        promiseAjax('POST',url,fd,header).then(function(res){
            // 成功時調用
            console.log(res)
        }).then(function(err){
            // 失敗時調用
            if(err)console.log(err);
        }).catch(function(err){
            // 服務器請求錯誤
            console.log(err)
        });
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章