最经在工作中要实现文件的无刷新上传,当然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
分享到:
相关推荐
本文将基于提供的标题、描述和部分内容,深入探讨如何利用AjaxFileUploader插件实现带参数上传附件的功能,以及其背后的原理与实践。 ### AjaxFileUploader简介 AjaxFileUploader是一个基于jQuery的插件,它允许...
AjaxFileUpload是基于JavaScript和AJAX技术的一种实现文件上传的方式,它允许用户在不刷新整个页面的情况下进行文件上传,提供了一种更为流畅的用户体验。在本文中,我们将深入探讨AjaxFileUpload的工作原理、如何...
`ajaxFileUpload`的主要优点在于其易于集成和定制,可以根据需求调整上传参数和回调函数。 在开始实现之前,我们需要确保项目中引入了必要的依赖,如本例中的`jquery-1.7.1.js`。jQuery是一个广泛使用的JavaScript...
3. **配置AjaxFileUpload**:使用jQuery选择器获取文件输入元素,并调用AjaxFileUpload方法进行配置,包括设置上传URL、成功回调、错误回调等。 4. **触发上传**:绑定一个点击事件到上传按钮,当点击时触发文件上传...
**AjaxFileUpload异步上传文件技术详解** AjaxFileUpload是一种基于JavaScript和Ajax技术的文件上传组件,它允许用户在不刷新整个页面的情况下实现文件的异步上传,极大地提升了用户体验。这个组件广泛应用于Web...
标题中的“文件上传 ajaxfileupload.zip”提示我们这个压缩包可能包含了一个用于实现文件上传功能的JavaScript库,名为“ajaxfileupload.js”。在Web开发中,文件上传是常见且重要的功能,尤其在需要用户提交图片、...
这个方法通常会接受MultipartFile类型的参数,这是Spring MVC提供的用于处理文件上传的类。你可以设置文件保存路径,校验文件类型和大小,然后将文件写入到指定位置。 以下是一个简单的示例: ```java @Controller...
`ajaxFileUpload`是一个JavaScript插件,它允许开发者利用Ajax技术实现异步文件上传,特别是图片上传,无需刷新整个页面。这种方法提高了用户体验,因为它可以在后台处理上传过程,保持页面的实时性和流畅性。 `...
## AjaxFileupload实现多文件上传功能详解 AjaxFileupload是一款常用的JavaScript插件,用于实现异步文件上传功能。在Web开发中,多文件上传的需求越来越普遍,尤其是在用户需要一次性上传多个文件时。本篇文章将...
曾经下载多个版本,均未找到能完美实现附带参数上传的ajaxfileupload JS文件。这是自己多次修改目前一直使用的珍藏源码,绝对能实现上传文件的同时附带参数上传,如果需要了解后台对参数的解析方法,可以留言询问。...
3. **初始化插件**:通过`.ajaxFileUpload()`方法绑定到文件输入元素上,并设置必要的参数,如URL(服务器端处理上传的接口)、数据(可选,附加到请求的数据)和回调函数。 4. **处理结果**:定义各种状态的回调...
该js包是在官方下载的ajaxFileUpload.js基础上所做修改后的包,修改该包所要解决的问题包括: 1、浏览器上传文件后不刷新页面再次点击上传时后台...3、解决了使用ajaxFileUpload除了上传文件外不能传递其他参数的bug。
`ajaxFileUpload`就是一种实现Ajax无刷新上传文件的方法,它结合了jQuery库的优势,为用户提供了无缝的文件上传体验。本文将详细介绍`ajaxFileUpload`的工作原理、使用方法及其在实际项目中的应用。 `...
综上所述,`ajaxFileUpload`是jQuery提供的一种实现异步文件上传的便捷工具,通过合理的配置和使用,可以极大地优化用户的文件上传体验。在实际应用中,根据项目需求灵活调整参数和处理逻辑,确保文件上传功能既安全...
`ajaxupload.js` 和 `ajaxfileupload.js` 是两个用于实现异步文件上传的JavaScript库,它们简化了这个过程并提供了丰富的自定义选项。 首先,`ajaxupload.js` 是一个轻量级的插件,它扩展了传统的Ajax功能,允许...
利用jQuery和AJAXFileUpload插件,可以实现文件选择后无刷新上传。例如,你可以创建一个`<input type="file">`元素,绑定AJAXFileUpload事件监听器,当用户选择文件后,触发AJAX请求,将文件数据发送到服务器。 2. ...
这个方法通常会接收HttpPostedFileBase类型的参数,这是ASP.NET MVC用来处理文件上传的类。 ```csharp [HttpPost] public ActionResult Upload(HttpPostedFileBase file) { if (file != null && file.Content...
主要介绍了jQuery异步上传文件插件ajaxFileUpload详细介绍,本文首先讲解了ajaxFileUpload的参数、错误提示等知识,然后给出了简单使用实例和ASP.NET MVC模式下的使用实例,需要的朋友可以参考下
使用ajaxFileUpload,开发者只需配置一些参数,如URL、数据、回调函数等,就可以实现无刷新的文件上传。 4. **服务器端处理**:在接收到Ajax上传的文件后,服务器端需要解析接收到的数据并保存文件。这可能涉及到...
1:无法带参数提交,只能上传文件; 2:运行时报:jQuery.handleError is not a function 错误; 3:执行成功后,始终指向error方法处理,无法执行sucess方法; 解决方法: 1:无法带参数提交,只能上传文件; 原...