`
xiaobai233
  • 浏览: 59788 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ajaxfileupload带参数上传文件

阅读更多
        最经在工作中要实现文件的无刷新上传,当然XmlHttpRequest对象是无法实现文件的上传功能的。google后找到JQuery的fileupload插件,此插件通过一个IFrame并在IFrame中创建一个form表单来实现文件上传;而在我的应用中还需要带一些其他的文本参数,而此插件并未提供此功能。
        既然是动态创建form表单,那么更定能加入其他参数的,请看代码(注意第41行):


jQuery.extend({
    createUploadIframe: function(id, uri)
	{
			//create frame
            var frameId = 'jUploadFrame' + id;
            
            if(window.ActiveXObject) {
                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			
    },
    createUploadForm: function(id, fileElementId, data)
	{
		//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>');	
		var oldElement = $('#' + fileElementId);
		var newElement = $(oldElement).clone();
		$(oldElement).attr('id', fileId);
		$(oldElement).before(newElement);
		$(oldElement).appendTo(form);
		
		//增加文本参数的支持
		if (data) {
			for (var i in data) {
				$('<input type="hidden" name="' + i + '" value="' + data[i] + '" />').appendTo(form);
			}
		}
		
		//set attributes
		$(form).css('position', 'absolute');
		$(form).css('top', '-1200px');
		$(form).css('left', '-1200px');
		$(form).appendTo('body');		
		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, s.data);
		var io = jQuery.createUploadIframe(id, s.secureuri);
		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" )
            eval( "data = " + data );
        // evaluate scripts within html
        if ( type == "html" )
            jQuery("<div>").html(data).evalScripts();
			//alert($('param', data).each(function(){alert($(this).attr('value'));}));
        return data;
    }
})



使用方法:
$.ajaxFileUpload({
		url: '/ajax/mine/uploadLogo',
		secureuri:false,
		fileElementId:'input_logo',
		dataType: 'json',
		data: {//加入的文本参数
			"logoPath": "param1",
			"logoName": "param2"
		},
		success: function(data) {
			
		},
		error: function() {
			showError("上传失败,请检查文件是否符合格式要求。");
			
		}
		
	});


最后注意服务器返回的response type必须是text/html
2
2
分享到:
评论
9 楼 zliao520 2015-11-18  
   //增加文本参数的支持  
        if (data) {  
            for (var i in data) {  
                $('<input type="hidden" name="' + i + '" value="' + data[i] + '" />').appendTo(form);  
            }  
        }  

改成
   //增加文本参数的支持  
        if (data) {  
            for (var i in data) {  
               var temp =  $('<input type="hidden" name="' + i +'" />');
               temp.val(data[i]);
               temp.appendTo(form);  
            }  
        }  
8 楼 zjut222 2015-07-21  
struts2后端接收不到任何参数, 什么原因呢?
7 楼 ltr15036900300 2015-05-25  
传递参数后台接收不到啊,是不是接收参数方式不同啊?
6 楼 u013810758 2015-05-13  
实在太感谢你了 我找了好久原因没找到  
5 楼 tianshui0823 2015-03-11  
不错,多谢了
4 楼 125348369 2014-09-28  
用struts2 接收  ajaxfleupload 传递的参数,一直不成功。request获取不到。
3 楼 IMAUZS 2014-08-12  
传参数这么写了,后台servlet接收参数写法应该是怎么样的,是不是接收参数写法不一样
2 楼 CommonAccount 2014-07-26  
不给力啊,写了还是传不上去
1 楼 chenlei239 2012-12-26  
您这上传css文件可以上传吗?

相关推荐

    ajaxfileupload带参数上传附件

    本文将基于提供的标题、描述和部分内容,深入探讨如何利用AjaxFileUploader插件实现带参数上传附件的功能,以及其背后的原理与实践。 ### AjaxFileUploader简介 AjaxFileUploader是一个基于jQuery的插件,它允许...

    AjaxFileUpload实现文件上传

    AjaxFileUpload是基于JavaScript和AJAX技术的一种实现文件上传的方式,它允许用户在不刷新整个页面的情况下进行文件上传,提供了一种更为流畅的用户体验。在本文中,我们将深入探讨AjaxFileUpload的工作原理、如何...

    ajaxFileUpload+springMvc上传文件

    `ajaxFileUpload`的主要优点在于其易于集成和定制,可以根据需求调整上传参数和回调函数。 在开始实现之前,我们需要确保项目中引入了必要的依赖,如本例中的`jquery-1.7.1.js`。jQuery是一个广泛使用的JavaScript...

    jquery+ajaxfileupload+html文件上传

    3. **配置AjaxFileUpload**:使用jQuery选择器获取文件输入元素,并调用AjaxFileUpload方法进行配置,包括设置上传URL、成功回调、错误回调等。 4. **触发上传**:绑定一个点击事件到上传按钮,当点击时触发文件上传...

    ajaxfileupload异步上传文件

    **AjaxFileUpload异步上传文件技术详解** AjaxFileUpload是一种基于JavaScript和Ajax技术的文件上传组件,它允许用户在不刷新整个页面的情况下实现文件的异步上传,极大地提升了用户体验。这个组件广泛应用于Web...

    文件上传 ajaxfileupload.zip

    标题中的“文件上传 ajaxfileupload.zip”提示我们这个压缩包可能包含了一个用于实现文件上传功能的JavaScript库,名为“ajaxfileupload.js”。在Web开发中,文件上传是常见且重要的功能,尤其在需要用户提交图片、...

    SpringMVC结合ajaxfileupload.js实现文件无刷新上传

    这个方法通常会接受MultipartFile类型的参数,这是Spring MVC提供的用于处理文件上传的类。你可以设置文件保存路径,校验文件类型和大小,然后将文件写入到指定位置。 以下是一个简单的示例: ```java @Controller...

    使用ajaxFileUpload实现图片上传

    `ajaxFileUpload`是一个JavaScript插件,它允许开发者利用Ajax技术实现异步文件上传,特别是图片上传,无需刷新整个页面。这种方法提高了用户体验,因为它可以在后台处理上传过程,保持页面的实时性和流畅性。 `...

    ajaxFileupload实现多文件上传功能

    ## AjaxFileupload实现多文件上传功能详解 AjaxFileupload是一款常用的JavaScript插件,用于实现异步文件上传功能。在Web开发中,多文件上传的需求越来越普遍,尤其是在用户需要一次性上传多个文件时。本篇文章将...

    支持附带参数提交的ajaxfileupload.js文件

    曾经下载多个版本,均未找到能完美实现附带参数上传的ajaxfileupload JS文件。这是自己多次修改目前一直使用的珍藏源码,绝对能实现上传文件的同时附带参数上传,如果需要了解后台对参数的解析方法,可以留言询问。...

    AjaxFileUpload 文件下载

    3. **初始化插件**:通过`.ajaxFileUpload()`方法绑定到文件输入元素上,并设置必要的参数,如URL(服务器端处理上传的接口)、数据(可选,附加到请求的数据)和回调函数。 4. **处理结果**:定义各种状态的回调...

    ajaxfileupload.js文件

    该js包是在官方下载的ajaxFileUpload.js基础上所做修改后的包,修改该包所要解决的问题包括: 1、浏览器上传文件后不刷新页面再次点击上传时后台...3、解决了使用ajaxFileUpload除了上传文件外不能传递其他参数的bug。

    ajaxFileUpload文件上传

    `ajaxFileUpload`就是一种实现Ajax无刷新上传文件的方法,它结合了jQuery库的优势,为用户提供了无缝的文件上传体验。本文将详细介绍`ajaxFileUpload`的工作原理、使用方法及其在实际项目中的应用。 `...

    ajaxfileupload

    综上所述,`ajaxFileUpload`是jQuery提供的一种实现异步文件上传的便捷工具,通过合理的配置和使用,可以极大地优化用户的文件上传体验。在实际应用中,根据项目需求灵活调整参数和处理逻辑,确保文件上传功能既安全...

    使用ajaxupload.js/ajaxfileupload.js实现文件上传

    `ajaxupload.js` 和 `ajaxfileupload.js` 是两个用于实现异步文件上传的JavaScript库,它们简化了这个过程并提供了丰富的自定义选项。 首先,`ajaxupload.js` 是一个轻量级的插件,它扩展了传统的Ajax功能,允许...

    PHP ajaxfileupload上传,jcrop图片裁剪

    利用jQuery和AJAXFileUpload插件,可以实现文件选择后无刷新上传。例如,你可以创建一个`&lt;input type="file"&gt;`元素,绑定AJAXFileUpload事件监听器,当用户选择文件后,触发AJAX请求,将文件数据发送到服务器。 2. ...

    ajaxfileupload实现文件上传_aspnet.zip

    这个方法通常会接收HttpPostedFileBase类型的参数,这是ASP.NET MVC用来处理文件上传的类。 ```csharp [HttpPost] public ActionResult Upload(HttpPostedFileBase file) { if (file != null && file.Content...

    jQuery异步上传文件插件ajaxFileUpload详细介绍

    主要介绍了jQuery异步上传文件插件ajaxFileUpload详细介绍,本文首先讲解了ajaxFileUpload的参数、错误提示等知识,然后给出了简单使用实例和ASP.NET MVC模式下的使用实例,需要的朋友可以参考下

    ajaxFileUpload 无刷新无Form上传

    使用ajaxFileUpload,开发者只需配置一些参数,如URL、数据、回调函数等,就可以实现无刷新的文件上传。 4. **服务器端处理**:在接收到Ajax上传的文件后,服务器端需要解析接收到的数据并保存文件。这可能涉及到...

    Jquery上传插件文件ajaxfileupload.js 修复版下载

    1:无法带参数提交,只能上传文件; 2:运行时报:jQuery.handleError is not a function 错误; 3:执行成功后,始终指向error方法处理,无法执行sucess方法; 解决方法: 1:无法带参数提交,只能上传文件; 原...

Global site tag (gtag.js) - Google Analytics