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)
        });
    }

 

posted @ 2023-02-03 19:16  柔和的天空  阅读(34)  评论(0编辑  收藏  举报