前段时间在解决ajax上传文件时折腾了好一阵。直接用$.post上传文本信息肯定是没有问题的。但是$.post直接上传图片是不可行的。
后来看到网上的一些解决方案,有现成的ajax上传文件的封装的方法也有利用flash的。flash确实是个好方法 但是不是每个人都会flash的而且下载下来现成的方法要做修改也不是件易事,且文件相对较大。最后只好模拟iframe来实现。发现相当的简单。
html:
1 |
< iframe name = "ajaxUpload" style = "display:none" ></ iframe > |
2 |
< form name = "from1" id = "from1" method = "post" action = "url" enctype = "multipart/form-data" target = "ajaxUpload" > |
6 |
< td >< input type = "file" id = "document" name = "document" /></ td > |
这里是重点。要上传文件enctype这个属性不可少,target的值改为iframe的name的值。
下面写一下js代码,我是用的jQuery所以在用的时候载入jquery的库是必不可少的。
3 |
window.form1.submit();} else { |
这里是做了一个浏览器版本的判断,因为IE是不太符合规范的一个浏览器,尤其是IE6。IE6是不直接支持$("#idName").submit();这种方式的。
服务端如下,还得返回一个值,直接submit是无法返回值的
03 |
HttpPostedBase
ff=Request.Files[ "document" ]; |
04 |
string
fileName=System.DateTime.Now+ff.FileName.ToString(); |
07 |
SaveAs(documentPath+fileName+extendtionName); |
08 |
Response.Write( "<script
type='text/javascript' type='language'>parent.window.callBackMethod('上传成功');</scrpt>" ); |
12 |
Response.Write( "<script
type='text/javascript' type='language'>parent.window.callBackMethod('上传失败');</scrpt>" ); |
模拟iframe其实是页面局部更新,但是页面中的这个iframe没有内容而且还是不显示的,所以它刷新了完全不会影响到整个页面。