ajaxFileUpload.js上传图片插件,全浏览器兼容,规避json错误,带文件格式大小拦截

本文介绍了如何利用ajaxFileUpload.js这个JavaScript插件进行图片上传,该插件具有全浏览器兼容性和文件格式大小的拦截功能,有效避免JSON错误。提供示例代码供读者参考和讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上代码了  有不理解的可以评论区@我  一起讨论。

/*
 2017/04/17-zhaoyf-ajaxFileUpload.js 无刷新上传图片 jquery 插件,支持 ie6-ie11
 依赖:jquery.js
 主方法:ajaxFileUpload 接受 json 对象参数
 参数说明:
 fileElementId:必选,上传文件域ID
 url:必选,发送请求的URL字符串
 fileFilter:可选,限定上传文件的格式,包括格式字符串即可
 fileSize:可选,0 为无限制,字符显示只是个人爱好,可以自由设定
 data:可选,将和文件域一同post的参数(json对象)
 其它:$.ajax 的参数均为可选参数
 注:如遇到‘无法访问’的脚本错误提示则需要在响应流中加一段脚块一同输出:<script ...>document.domain = 'xxx.com';</script>
 */
/**
 * 异步上传文件
 * @param url       提交路径
 * @param fileId    准备提交的文件input框
 * @param imgId     准备显示上传图片的img标签
 * @param data      准备和图片一起提交的数据
 *                  注册时设置为null,修改时用值对指定字段修改
 * imgUrl : 全局变量
 * @returns {boolean}
 */
/*function uploadImg(url,fileId, imgId ,data) {
    $.ajaxFileUpload({
        url: url,
        fileElementId: fileId,
        dataType: 'json',
		fileFilter:'jpgpng',
        data: data,
        beforeSend: function (XMLHttpRequest) {
            //("加载前");
        },
        success:function (result) {
            if(result.state){
                alert("用户头像路径:"+result.imgUrl);
                //$("#"+imgId).attr("src",result.imgUrl);
                imgUrl = result.imgUrl;
            }else{
                alert(result.message);
            }
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert("图片上传失败!");
        },
        complete: function (XMLHttpRequest, textStatus) {
            //("加载后");
        }
    });
}*/
jQuery.extend({
    //创建 iframe 元素,接受提交及响应
    createUploadIframe: function(id, uri) {
        //create frame
        var frameId = 'jUploadFrame' + id;


        if (window.ActiveXObject) {
            //fix ie9 and ie 10-------------
            if (jQuery.browser.version == "9.0" || jQuery.browser.version == "10.0") {
                var io = document.createElement('iframe');
                io.id = frameId;
                io.name = frameId;
            } else if (jQuery.browser.version == "6.0" || jQuery.browser.version == "7.0" || jQuery.browser.version == "8.0") {
                var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
                if (typeof uri == 'boolean') {
                    io.src = 'javascript:false';
                } else if (typeof uri == 'string') {
                    io.src = uri;
                }
            }
        } else {
            var io = document.createElement('iframe');
            io.id = frameId;
            io.name = frameId;
        }
        io.style.position = 'absolute';
        io.style.top = '-1000px';
        io.style.left = '-1000px';


        document.body.appendChild(io);


        return io;
    },
    //创建 from 元素,用于提交的表单
    createUploadForm: function(id, fileElementId, postData) {
        //create form<span style="white-space:pre">   </span>
        var formId = 'jUploadForm' + id;
        var fileId = 'jUploadFile' + id;
        var form = $('<form  action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');
        var oldElement = $('#' + fileElementId);
        var newElement = $(oldElement).clone();


        $(oldElement).attr('id', fileId);
        $(oldElement).before(newElement);
        $(oldElement).appendTo(form);
        //添加自定义参数
        if (postData) {
            //递归遍历JSON所有键值
            function recurJson(json) {
                for (var i in json) {
                    //alert(i+"="+json[i])
                    $("<input name='" + i + "' id='" + i + "' value='" + json[i] + "' />").appendTo(form);
                    if (typeof json[i] == "object") {
                        recurJson(json[i]);
                    }
                }
            }
            recurJson(postData);
        }
        //set attributes
        $(form).css('position', 'absolute');
        $(form).css('top', '-1200px');
        $(form).css('left', '-1200px');
        $(form).appendTo('body');
        return form;
    },
    //上传文件
    //s 参数:json对象
    ajaxFileUpload: function(s) {
        s = jQuery.extend({fileFilter:"",fileSize:0}, jQuery.ajaxSettings, s);
        //文件格式限制
        var fileName = $('#' + s.fileElementId).val();
        if(fileName == undefined || fileName == null || fileName == ""){
            return;
        }
        var extention = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
        if (s.fileFilter && s.fileFilter.indexOf(extention) < 0) {
            alert("不支持 " + extention + " 为后缀名的文件!");
            $('#' + s.fileElementId).val("");
            return;
        }
        //文件大小限制
        if (s.fileSize > 0) {
            var fs = 0;
            try {
                if (window.ActiveXObject) {
                    //IE浏览器
                    var image = new Image();
                    image.dynsrc = fileName;
                    fs = image.fileSize;
                } else {
                    fs = $('#' + s.fileElementId)[0].files[0].size;
                }
            } catch(e) {
            }
            if (fs > s.fileSize) {
                fs = fs/1024/1024;
                fs = fs.toString().substring(0,4);
                alert("当前文件大小 " + fs + "MB 超过允许的限制值 " + s.fileSize/1024/1024 +"MB!");
                $('#' + s.fileElementId).val("");
                return;
            }
        }
        var id = new Date().getTime();
        //创建 form 表单元素
        var form = jQuery.createUploadForm(id, s.fileElementId, s.data);
        //创建 iframe 贞元素
        var io = jQuery.createUploadIframe(id, s.secureuri);
        var frameId = 'jUploadFrame' + id;
        var formId = 'jUploadForm' + id;
        //监测是否有新的请求
        if (s.global && !jQuery.active++) {
            jQuery.event.trigger("ajaxStart"); //触发 AJAX 请求开始时执行函数。Ajax 事件。
        }
        var requestDone = false;
        //创建请求对象
        var xml = {};
        if (s.global)
            jQuery.event.trigger("ajaxSend", [xml, s]); //触发 AJAX 请求发送前事件
        //上传完成的回调函数
        var uploadCallback = function(isTimeout) {
            var io = document.getElementById(frameId);
            try {
                //存在跨域脚本访问问题,如遇到‘无法访问’提示则需要在响应流中加一段脚块:<script ...>document.domain = 'xxx.com';</script>
                if (io.contentWindow) { //兼容各个浏览器,可取得子窗口的 window 对象
                    xml.responseText = io.contentWindow.document.body ? io.contentWindow.document.body.innerHTML : null;
                    xml.responseXML = io.contentWindow.document.XMLDocument ? io.contentWindow.document.XMLDocument : io.contentWindow.document;


                } else if (io.contentDocument) { //contentDocument Firefox 支持,> ie8 的ie支持。可取得子窗口的 document 对象。
                    xml.responseText = io.contentDocument.document.body ? io.contentDocument.document.body.innerHTML : null;
                    xml.responseXML = io.contentDocument.document.XMLDocument ? io.contentDocument.document.XMLDocument : io.contentDocument.document;
                }
            } catch(e) {
                jQuery.handleErrorExt(s, xml, null, e);
            }
            if (xml || isTimeout == "timeout") {
                requestDone = true;
                var status;
                try {
                    status = isTimeout != "timeout" ? "success" : "error";
                    // Make sure that the request was successful or notmodified
                    if (status != "error") {
                        //处理数据(运行XML通过httpData不管回调)
                        var data = jQuery.uploadHttpData(xml, s.dataType);
                        // If a local callback was specified, fire it and pass it the data
                        if (s.success)
                            s.success(data, status);


                        // Fire the global callback
                        if (s.global)
                            jQuery.event.trigger("ajaxSuccess", [xml, s]);
                    } else
                        jQuery.handleErrorExt(s, xml, status);
                } catch(e) {
                    status = "error";
                    jQuery.handleErrorExt(s, xml, status, e);
                }


                // The request was completed
                if (s.global)
                    jQuery.event.trigger("ajaxComplete", [xml, s]);


                // Handle the global AJAX counter
                if (s.global && !--jQuery.active)
                    jQuery.event.trigger("ajaxStop");


                // Process result
                if (s.complete)
                    s.complete(xml, status);


                jQuery(io).unbind();


                setTimeout(function() {
                    try {
                        $(io).remove();
                        $(form).remove();
                    } catch(e) {
                        jQuery.handleErrorExt(s, xml, null, e);
                    }


                }, 100);


                xml = null;


            }
        };
        //超时检查,s.timeout 毫秒后调用 uploadCallback 回调函数提示请求超时
        if (s.timeout > 0) {
            setTimeout(function() {
                // Check to see if the request is still happening
                if (!requestDone) uploadCallback("timeout");
            }, s.timeout);
        }
        try {
            //设置动态 form 表单的提交参数
            // var io = $('#' + frameId);
            var form = $('#' + formId);
            $(form).attr('action', s.url);
            $(form).attr('method', 'POST');
            $(form).attr('target', frameId);
            if (form.encoding) {
                form.encoding = 'multipart/form-data';
            } else {
                form.enctype = 'multipart/form-data';
            }
            $(form).submit();


        } catch(e) {
            jQuery.handleErrorExt(s, xml, null, e);
        }
        //向动态表单的页面加载事件中注册回调函数
        if (window.attachEvent) {
            document.getElementById(frameId).attachEvent('onload', uploadCallback);
        } else {
            document.getElementById(frameId).addEventListener('load', uploadCallback, false);
        }
        return {
            abort: function() {
            }
        };


    },
    //上传文件
    uploadHttpData: function(r, type) {
        //alert("type=" + type + ";uploadHttpData" + JSON.stringify(r))
        var data = !type;
        data = type == "xml" || data ? r.responseXML : r.responseText;
        // If the type is "script", eval it in global context
        if (type == "script")
            jQuery.globalEval(data);
        // Get the JavaScript object, if JSON is used.
        if (type == "json") {
            //全浏览器兼容
            try {
                data = jQuery.parseJSON(data);
            } catch (e) {
                data = jQuery.parseJSON(jQuery(data).text());
            }
        }
        // evaluate scripts within html
        if (type == "html")
            jQuery("<div>").html(data).evalScripts();
        //alert($('param', data).each(function(){alert($(this).attr('value'));}));
        return data;
    },
    handleErrorExt: function(s, xhr, status, e) {
        // If a local callback was specified, fire it
        if (s.error) {
            s.error.call(s.context || s, xhr, status, e);
        }


        // Fire the global callback
        if (s.global) {
            (s.context ? jQuery(s.context) : jQuery.event).trigger("ajaxError", [xhr, s, e]);
        }
    }
});




                
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值