基于ajax实现上传图片代码示例解析
js源码:
///
///
/*!
*jQueryupload
*用于上传单个文件,上传成功后,返回文件路径。
*本插件依赖jQuery,jquery.form请在使用时引入依赖的文件
*
*Date:2014/4/23
*/
/*
使用:
html:
js:
$(document).ready(function(){
//$(".upload").upload({
//uploadData:{id:"12233"},
//successFn:function(response,statusText,xhr,$this){
//alert(response.Data.RelativePath)
//},
//deleteData:{id:function(){return"asdfasdf"}}
//});
$(".upload").upload({
uploadData:{id:"12233"},
successFn:"success",//可以是字符串
deleteData:{id:function(){return"asdfasdf"}}
});
});
//上传成功后执行该函数
functionsuccess(response,statusText,xhr,$this){
//比如插入编辑器
alert(response.Data.RelativePath+$this.attr("value"))
}
*/
(function($){
$.extend($.fn,{
upload:function(settings){
varoptions=$.extend({
fileType:"gif|jpg|jpeg|png|bmp",//允许的文件格式
uploadUrl:"/ajax/handler.ashx?action=uploadfile",//上传URL地址
deleteUrl:"/ajax/handler.ashx?action=deletefile",//删除URL地址
width:"",//图片显示的宽度
height:100,//图片显示的高度
imgSelector:".imgdiv",//图片选择器
uploadData:{},//上传时需要附加的参数
deleteData:{},//删除时需要附加的参数
deleteFn:function($parent,showMessage){//删除图片的方法(默认方法使用POST提交)
methods.deleteImage($parent,showMessage);
},
beforeSubmitFn:"beforeUpload",//上传前执行的方法原型beforeSubmit(arr,$form,options);
successFn:"uploadSuccess",//上传成功后执行的方法uploadSuccess(response,statusText,xhr,$this)
errorFn:"uploadError"//上传失败后执行的方法
},settings);
//上传准备函数
varmethods={
//验证文件格式
checkFile:function(filename){
varpos=filename.lastIndexOf(".");
varstr=filename.substring(pos,filename.length);
varstr1=str.toLowerCase();
if(typeofoptions.fileType!=='string'){options.fileType="gif|jpg|jpeg|png|bmp";}
varre=newRegExp("\.("+options.fileType+")$");
returnre.test(str1);
},
//创建表单
createForm:function(){
var$form=document.createElement("form");
$form.action=options.uploadUrl;
$form.method="post";
$form.enctype="multipart/form-data";
$form.style.display="none";
//将表单加当document上,
document.body.appendChild($form);//创建表单后一定要加上这句否则得到的form不能上传。document后要加上body,否则火狐下不行。
return$($form);
},
//创建图片
createImage:function(){
//不能用newImage()来创建图片,否则ie下不能改变img的宽高
varimg=$(document.createElement("img"));
img.attr({"title":"双击图片可删除图片!"});
if(options.width!==""){
img.attr({"width":options.width});
}
if(options.height!==""){
img.attr({"height":options.height});
}
returnimg;
},
showImage:function(filePath,$parent){
var$img=methods.createImage();
$parent.find(options.imgSelector).find("img").remove();
//要先append再给img赋值,否则在ie下不能缩小宽度。
$img.appendTo($parent.find(options.imgSelector));
$img.attr("src",filePath);
this.bindDelete($parent);
},
bindDelete:function($parent){
$parent.find(options.imgSelector).find("img").bind("dblclick",function(){
options.deleteFn($parent,true);
});
},
deleteImage:function($parent,showMessage){
var$fileInput=$parent.find("input:hidden");
if($fileInput.val()!==""){
vardata=$.extend(options.deleteData,{filePath:$fileInput.val(),t:Math.random()});
$.post(options.deleteUrl,data,function(response){
if(showMessage){alert(response.MessageContent)}
if(response.MessageType==1){
$fileInput.val("");
$parent.find(options.imgSelector).find("img").remove();
}
},"JSON");
}
},
onload:function($parent){
varhiddenInput=$parent.find("input:hidden");
if(typeofhiddenInput!=="undefined"&&hiddenInput.val()!==""){
varimg=methods.createImage();
if($parent.find(options.imgSelector).find("img").length>0){$parent.find(options.imgSelector).find("img").remove();}
//要先append再给img赋值,否则在ie下不能缩小宽度。
img.appendTo($parent.find(options.imgSelector));
img.attr("src",hiddenInput.val());
methods.bindDelete($parent);
}
}
};
//上传主函数
this.each(function(){
var$this=$(this);
methods.onload($this.parent());
$this.bind("click",function(){
var$fileInput=$(this).parent().find("input:file");
varfileBox=$fileInput.parent();
if($fileInput.val()===""){
alert("请选择要上传的图片!");
returnfalse;
}
//验证图片
if(!methods.checkFile($fileInput.val())){
alert("文件格式不正确,只能上传格式为:"+options.fileType+"的文件。");
returnfalse;
}
//若隐藏域中有图片,先删除图片
if($fileInput.val()!==""){
options.deleteFn($this.parent(),false);
//methods.deleteImage($this.parent(),false);
}
//创建表单
var$form=methods.createForm();
//把上传控件附加到表单
$fileInput.appendTo($form);
fileBox.html("
正在上传...");
$this.attr("disabled",true);
//构建ajaxSubmit参数
vardata={};
data.data=options.uploadData;
data.type="POST";
data.dataType="JSON";
//上传前
data.beforeSubmit=function(arr,$form,options){
varbeforeSubmitFn;
try{beforeSubmitFn=eval(options.beforeSubmitFn)}catch(err){};
if(beforeSubmitFn){
var$result=beforeSubmitFn(arr,$form,options);
if(typeof($result)=="boolean")
return$result;
}
};
//上传失败
data.error=function(response,statusText,xhr,$form){
varerrorFn;
try{errorFn=eval(options.errorFn)}catch(err){};
if(errorFn){
errorFn(response.responseText,statusText,xhr,$this);
}
};
//上传成功
data.success=function(response,statusText,xhr,$form){
//response=eval("("+response+")");
if(response.MessageType==1){
methods.showImage(response.Data.RelativePath,$this.parent());
$this.parent().find("input:hidden").val(response.Data.RelativePath);
varsuccessFn;
try{successFn=eval(options.successFn)}catch(err){};
if(successFn){
$.ajaxSetup({cache:false});//这个不能少,否则ie下会提示下载
successFn(response,statusText,xhr,$this);
}
}else{
alert(response.MessageContent);
}
$this.attr("disabled",false);
fileBox.html("
");
$form.remove();
};
try{
//开始ajax提交表单
$form.ajaxSubmit(data);
}catch(e){
alert(e.message);
}
});
});
}
});
})(jQuery)
html代码: