二期项目总结(一) 通过a标签打开文件上传选择框,使用Ajax上传文件
很多时候我们会给a标签增加一个点击事件,用于上传文件。为什么不使用原滋原味的文本打开按钮呢?当然是不好看,而且样式难以控制。
这时候可以通过控制a标签,给它添加一个点击事件,在a标签触发点击事件的时候打开文本选择框,就很好看了。
好了,现在来上思路:
先要给出一个a标签和文本选择的打开input,但是这个input的display要设置为none, 如下:
<a id="uoloadA" onclick="ClickInput()">上传文件</a> <input type="file" style="display:none" id="InputUpload" onchange="changeInput()"/>
a标签有一个点击方法,点击时触发这个方法,这个方法里面用于打开文本选择器,如下:
function ClickInput(){ //动态给文件打开框触发点击事件 document.getElementById("InputUpload").click(); }
这样,一点击a标签就会打开文本选择框,
input里面有一个onchange的方法,用于监控文本选择器的状态,如果文本选择器选择了一个文件,就会触发这个方法。那么这个方法里面写的就是ajaxFileUpload的请求代码了
如下:
//当文件选择框改变时,就上传文件,里面发Ajax请求到处理层 function changeInput(){ $.ajaxFileUpload({ fileElementId:'InputUpload', //要上传的文件的id url:'Upload.jsp', //请求的地址, type:'post', //请求的方式 dataType:'text', //返回数据时的格式,也可以将Text改为json,这个要看具体需求 secureuri: false, //是否需要安全协议,一般设置为false async : true, //是否是异步 success: function(data) { //提交成功后自动执行的处理函数,参数data就是服务器返回的数据。 if($.trim(data) != null){ alert("上传成功!"); } }, error: function(data, status, e) { //提交失败自动执行的处理函数。 alert("上传失败!"); } }); }
这样就可以上传一个文件到处理层,在处理层里面通过smartUpload来处理,就可以成功的上传一个文件了。
1、url 上传处理程序地址。
2,fileElementId 需要上传的文件域的ID,即<input type="file">的ID。
3,secureuri 是否启用安全提交,默认为false。
4,dataType 服务器返回的数据类型。可以为xml,script,json,html。如果不填写,jQuery会自动判断。
5,success 提交成功后自动执行的处理函数,参数data就是服务器返回的数据。
6,error 提交失败自动执行的处理函数。
7,data 自定义参数。这个东西比较有用,当有数据是与上传的图片相关的时候,这个东西就要用到了。
8, type 当要提交自定义参数时,这个参数要设置成post
错误提示:
1,SyntaxError: missing ; before statement错误
如果出现这个错误就需要检查url路径是否可以访问
2,SyntaxError: syntax error错误
如果出现这个错误就需要检查处理提交操作的服务器后台处理程序是否存在语法错误
3,SyntaxError: invalid property id错误
如果出现这个错误就需要检查文本域属性ID是否存在
4,SyntaxError: missing } in XML expression错误
如果出现这个错误就需要检查文件name是否一致或不存在
5,其它自定义错误
大家可使用变量$error直接打印的方法检查各参数是否正确,比起上面这些无效的错误提示还是方便很多。
接下来写一下smartUpload的处理
我这个写成了一个方法,但具体的内容差不多,
public String getMusicPath(PageContext pageContext){ SmartUpload su = new SmartUpload(); String filedName = ""; try { su.initialize(pageContext);//初始化smartUpload su.setMaxFileSize(1024 *1024*30); //设置传送文件的大小 su.setCharset("utf-8"); //设置编码集
su.setAllowedFilesList("mp3,mp4"); //设置要上传的后缀,以数组的方式提交,中间用逗号隔开,当然也可以只写一个后缀 su.upload();//上传 String basicPath = pageContext.getRequest().getRealPath("/") + "..\\" + "lrcInfo" + "\\"; //这个是上传之后的文件要存放的路径
//pageContext.getRequest().getRealPath("/")是获取当前项目的绝对路径
Files files = su.getFiles(); Collection<File> fls = files.getCollection(); for(File fl : fls){ if(!fl.isMissing()){ //如果文件存在 filedName = fl.getFileName(); fl.saveAs(basicPath + filedName); //以这样的绝对路径存放 } } } catch (ServletException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SmartUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } return filedName; //这里是因为自己的业务需求返回的文件名 }