笔记整理-ajaxFileUpload使用实例

本文介绍了如何使用ajaxFileUpload.js进行多文件上传,特别强调了在参数fileElementId中应传入数组形式的文件ID,例如['fileId_1', 'fileId_2', 'fileId_3'],以实现多个文件的选择和上传。" 119435645,10545599,LayUI动态设置checkbox显示与配置教程,"['前端开发', 'HTML', 'CSS', 'JavaScript', 'layui框架']
摘要由CSDN通过智能技术生成
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/ajaxfileupload.js"></script>
<script type="text/javascript">
function submitForm() {
	var json = $("#myForm").serializeJSON();
	$.ajaxFileUpload({
		url : url,
		type : 'post',
		data : json,
		secureuri : false, 		//一般设置为false
		fileElementId : 'file',		// 上传文件的id注意需要引号
		dataType : 'js', 		//返回值类型,一般设置为json、application/json
		success : function(data, status) {
			alert(data);
		},
		error : function(data, status, e) {
			alert(data);
		}
	});
}

//将表单数据序列化成json对象
$.fn.serializeJSON = function() {  
    var jsonObj = {};  
    var a = this.serializeArray();  
    $.each(a, function() {  
        if (jsonObj[this.name]) {  
            if (!jsonObj[this.name].push) {  
            	jsonObj[this.name] = [ jsonObj[this.name] ];  
            }  
            jsonObj[this.name].push($.trim(this.value) || '');  
        } else {  
        	jsonObj[this.name] = $.trim(this.value) || '';  
        }  
    });  
    return jsonObj; 
}
</script>

<form id="myForm">
	<table>
		<tr>
			<th><input id="title" name="title" type="text"/></th>
			<th>标题</th>
		</tr>
		<tbody>
			<tr>
				<td>
					<input type="file" id="file" />
				</td>
			</tr>
		</tbody>
	</table>
</form>
<div>
	<input type="button" οnclick="submitForm()">
</div>

使用ajaxfileupload.js时,需要注意对于多文件上传的修改,需要将fileElementId的传参改为['fileId_1', 'fileId_2', 'fileId_3']这种数组。

以下为实际项目使用JS:

/**
 * https://github.com/carlcarl/AjaxFileUpload
 */
jQuery.extend({
    createUploadIframe: function(id) {
        //create frame
        var frameId = 'jUploadFrame' + id;
        // The iframe must be appended as a string otherwise IE7 will pop up the response in a new window
        // http://stackoverflow.com/a/6222471/268669
        var style = "display: none; position: absolute; top: -1000px; left: -1000px;";
        $("body").append('<iframe src="javascript:false;" name="' + frameId + '" id="' + frameId + '" style="' + style + '"></iframe>');
        return $('#' + id);
    },
    createUploadForm: function(id, fileElementId) {
        //create form
        var formId = 'jUploadForm' + id;
        var fileId = 'jUploadFile' + id;
        var form = $('<form action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');
        //set fileId to array
        if(typeof(fileElementId) == 'string') {
            fileElementId = [fileElementId];
        }  
        for(var i in fileElementId) {
            var oldElement = $('#' + fileElementId[i]);
            var newElement = $(oldElement).clone();
            $(oldElement).attr('id', fileId + "_" + i);
            $(oldElement).before(newElement);
            $(oldElement).appendTo(form);
        } 
        //set attributes
        $(form).css('position', 'absolute');
        $(form).css('top', '-1200px');
        $(form).css('left', '-1200px');
        $(form).appendTo('body');
        return form;
    },
    addOtherRequestsToForm: function(form, data) {
        // add extra parameter
        var originalElement = $('<input type="hidden" name="" value="">');
        for(var key in data) {
            var name = key;
            var value = data[key];
            var cloneElement = originalElement.clone();
            cloneElement.attr({'name':name, 'value':value});
            $(cloneElement).appendTo(form);
        }
        return form;
    },
    ajaxFileUpload: function(s) {
        // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout
        s = jQuery.extend({}, jQuery.ajaxSettings, s);
        var id = new Date().getTime();
        var form = jQuery.createUploadForm(id, s.fileElementId);
        if(s.data) {
            form = jQuery.addOtherRequestsToForm(form, s.data);
        }
        jQuery.createUploadIframe(id);
        var frameId = 'jUploadFrame' + id;
        var formId = 'jUploadForm' + id;
        // Watch for a new set of requests
        if(s.global && ! jQuery.active++) {
            jQuery.event.trigger("ajaxStart");
        }
        var requestDone = false;
        // Create the request object
        var xml = {};
        if(s.global) {
            jQuery.event.trigger("ajaxSend", [xml, s]);
        }
        // Wait for a response to come back
        var uploadCallback = function(isTimeout) {
            var io = document.getElementById(frameId);
            try {
                if(io.contentWindow) {
                    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) {
                    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.handleError(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") {
                        // process the data (runs the xml through httpData regardless of callback)
                        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.handleError(s, xml, status);
                    }
                } catch(e) {
                    status = "error";
                    jQuery.handleError(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.handleError(s, xml, null, e);
                    }
                }, 100);
                xml = null;
            }
        };
        // Timeout checker
        if(s.timeout > 0) {
            setTimeout(function() {
                // Check to see if the request is still happening
                if(!requestDone) uploadCallback("timeout");
            }, s.timeout);
        } try {
            // 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.handleError(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) {
        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") {
            // If you add mimetype in your response,
            // you have to delete the '<pre></pre>' tag.
            // The pre tag in Chrome has attribute, so have to use regex to remove
            data = r.responseText;
            var rx = new RegExp("<pre.*?>(.*?)</pre>", "i");
            var am = rx.exec(data);
            //this is the desired data extracted
            data = (am) ? am[1] : data;//the only submatch or empty
            try {
                eval("data = " + data);
            } catch (e) {
                //If the data not json, return string
            }
        }
        // evaluate scripts within html
        if(type == "html") {
            jQuery("<div>").html(data).evalScripts();
        }        
        return data;
    }
});


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值