单按钮实现多附件上传(非异步,非flash,适用IE8)

单按钮实现多附件上传(非异步,非flash,适用IE8)
        
最近接到一个web项目,其中的一个模块中要求下属单位向上级单位发送信息,信息里面也可包含用户上传的附件,附件个数不

定。对于这个项目,经理有严格界面要求,只有有一个按钮,而且样式一定按照页面风格来设计。由于我是才毕业的大学生,在编程

上还是个菜鸟,只用一个按钮实现多附件上传的功能还没有真正上手做过,于是去网上求助。google、百度出来的结果大都是用

jquery_ajax实现异步上传,或者是用已经做好的flash包。jquery_ajax异步上传使用起来很不方便,虽然是异步上传,但是如果用户已经

上传了附件,但后来又取消了这条信息的发送呢?又得去服务器和数据库里把那条信息对应的附件删除,很是麻烦,而且jquery_ajax异

步上传与flash包有一个很大的问题,很难控制他们的样式,必须要看懂、病修改成百上千行的jquery代码或者自己制作一个flash按钮。

后来由于 项目进度比较紧,不可能花时间来改jquery代码和学习flash(本人是菜鸟 委屈 ),所幸就自己写了一个jquery的控件,故此来跟

大家分享 一下。

由于浏览器的安全设计,如果用button按钮绑定file标签的onclick()事件,在提交表单的时候flie标签的值会被清空,所以用常规方

法不能实现单按钮的多文件上传。那我们怎么办呢?规定是死的,但我们的脑子是活的,我想到如下的方法来解决这个问题:


当鼠标移动到“添加附件”按钮的时候,

将file标签覆盖到“添加附件“按钮之上,现在相信这些大家都有idea了,我们只需要给"添加附件"按钮绑定onmouseover()事件,当鼠

标移动到按钮上时候,创建一个file标签并覆盖在按钮之上,再把file标签设置为透明,用户点击的”添加附件“按钮,实际是点击的file

标签。

下面是我的例子:

fileUpload.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	<style type="text/css">
		
	</style>
	<script type="text/javascript" src="<%=basePath%>js/jquery.js"></script>
	<script type="text/javascript" src="<%=basePath%>js/extraUpload_jquery.js"></script>
	<script type="text/javascript">
		$(function(){
			moreFile($("#add"),$("#more"));
		})
		
	</script>
  </head>
  
  <body>
  	<form action="fileUpload" method="post" enctype="multipart/form-data">
    <input type = "button" value="添加附件" id="add" />
    <table border="1px" id="more">
    	<tr>
    		<td style="width:500px;text-align: center">附件名称</td><td style="width: 100px;text-align: center">操作</td>
    	</tr>
    	
    </table>
    </form>
  </body>
</html>

extraUpload_jquery.js
//单按钮实现多附件上传;
		//上传的file标签:<input type="file" name="uploadFile"/>  用"uploadFile"再后退进行文件操作
		//参数:btn(添加附件按钮jQurey对象,必须),
		//	   table(附件列表jQuery对象,必须);
        //     img_url(删除附件按钮图片url,非必须,如果不传入则按照一般按钮处理);
        //例子
        //	$(function(){
		//		moreFile($("#add"),$("#more"),"image/x1.jpg");
		//	});
		//或者
		//	$(function(){
		//		moreFile($("#add"),$("#more"));
		//	});
		function moreFile(btn,table,img_url){
			//绑定添加附件按钮事件
			btn.bind("mouseover",function(){
				var n;
				var file = $("<input type='file'  name='uploadFile'/>");
				//捕获按钮位置
				var position = btn.offset().left;
				//file标签覆盖添加附件按钮,并设置为透明		
				file.css({"position":"absolute","left":position-150,"filter":"Alpha(Opacity=0)"});
				file.insertAfter(btn);
				file.bind("change",function(){
					var curr_FileName = file.val();
					var trs = table.find("tr");
					//验证文件是否已经上传
					trs.each(function(i){
						var old_FileName = trs[i].firstChild.innerHTML;
						if(old_FileName==curr_FileName){
							alert("已经存在名为'"+curr_FileName+"'的文件");
							n=1;
							return false;
						}
					});
					if(n==1) return false;
					//附件列表新增一行
					var row = $("<tr/>");
					var col_1 = $("<td/>").css("textAlign","center").appendTo(row);
					var col_2 = $("<td/>").css("textAlign","center").appendTo(row);
					col_1.html(file.val());
					//方法重载
					if(typeof(img_url)=="undefined"){
						var deleteBtn = $("<input type='button' value='删除'/>").appendTo(col_2);
					}else{
						var deleteBtn = $("<img src="+img_url+">").appendTo(col_2);
					}
					row.appendTo(table);
					deleteBtn.click(function(){
						row.remove();
						file.remove();
					});
				});
				file.bind("mouseout",function(){
					file.css("left",600);
				});
			});
		}

在jsp中调用了extraUpload_jquery.js,和jquery包,注意它们之间的依赖关系和先后顺序。目前在IE8上测试没有任何问题,不知在firefox上表现如何,希望各位朋友多加指点。
另附extraUpload_jquery.js下载地址:点击打开链接


本实例采用的是Uploadify上传插件,.NET程序,源程序是从网上找的,但是有Bug,已经修改好,并标有部分注释。绝对好用,支持文件、多文件上传,支持大文件上传,已经过多方面测试,保证好用。 以下附上Uploadify部分常用的参数介绍,要看全部的就去看其API文件了,一般在下载的包里都有。  uploader : uploadify.swf 文件的相对路径,该swf文件是一个带有文字BROWSE的按钮,点击后弹出打开文件对话框,默认值:uploadify.swf。   script : 后台处理程序的相对路径 。默认值:uploadify.php   checkScript :用来判断上传选择的文件在服务器是否存在的后台处理程序的相对路径   fileDataName :设置一个名字,在服务器处理程序中根据该名字来取上传文件的数据。默认为Filedata   method : 提交方式Post 或Get 默认为Post   scriptAccess :flash脚本文件的访问模式,如果在本地测试设置为always,默认值:sameDomain   folder : 上传文件存放的目录 。   queueID : 文件队列的ID,该ID与存放文件队列的div的ID一致。   queueSizeLimit : 当允许多文件生成时,设置选择文件的个数,默认值:999 。   multi : 设置为true时可以上传多个文件。   auto : 设置为true当选择文件后就直接上传了,为false需要点击上传按钮上传 。   fileDesc : 这个属性值必须设置fileExt属性后才有效,用来设置选择文件对话框中的提示文本,如设置fileDesc为“请选择rar doc pdf文件”,打开文件选择框效果如下图:   fileExt : 设置可以选择的文件的类型,格式如:'*.doc;*.pdf;*.rar' 。   sizeLimit : 上传文件的大小限制 。   simUploadLimit : 允许同时上传的个数 默认值:1 。   buttonText : 浏览按钮的文本,默认值:BROWSE 。   buttonImg : 浏览按钮的图片的路径 。   hideButton : 设置为true则隐藏浏览按钮的图片 。   rollover : 值为true和false,设置为true时当鼠标移到浏览按钮上时有反转效果。   width : 设置浏览按钮的宽度 ,默认值:110。   height : 设置浏览按钮的高度 ,默认值:30。   wmode : 设置该项为transparent 可以使浏览按钮flash背景文件透明,并且flash文件会被置为页面的最高层。 默认值:opaque 。   cancelImg :选择文件到文件队列中后的每一个文件上的关闭按钮图标 Uploadify还自带了很多参数及有用的方法和回调函数,都在API里,虽然是全英文的,但很容易看懂,这里就不说了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值