最近项目经理逼着让偶做树的展开,表嵌套表,可惜偶刚参加工作,水平低,这不在查资料嘛,可是不多久就传来了经理的叫嚣声,这么简单的东西,都一天了,你还没做完..................,哎真是郁闷,谁让咱水平低呢(心想,什么时候等我水平提高了,看我怎么收拾你,又一想,等我水平提高了,人家早不知道干什么去了,废话不多说了)
文件上传一直是B/S结构中很重要的一项功能,在java中并没有很好的实现文件上传的类包,因此出现了一些开源的组件,Smartupload ,commons-fileupload,还有国内的一个"牛人"的(不好意思叫不上名字来),这几个组件中Smartupload 出来的时候应该最早,不过现在已经不再有新的版本出现,还有一个不足的地方就是Smartupload 支持上传的文件最大在100M左右,这可满足不了客户的需求,听说commons-fileupload不错,经过几番测试终于搞定,下面是代码,3个jsp文件 upload.jsp success.jsp error.jsp 一个action类
upload.jsp如下:
<%@ page language="java" contentType="text/html;charset=GBK"%> <%@ page import="java.util.*" %> <%@ page import="org.apache.commons.fileupload.*"%>
<%@ include file="/basic/include/headerjsf1.jsp" %>
<%pageContext.setAttribute("jsp.tags.reuse", new Boolean(false));%> <A:navigation/> <hr> <center><b><font size=+1><bean:message key="upload.name"/></font></b></center> <html> <head> <title>????</title> </head> <body>
<form action="/budget3/FileUploadAction.do" name="one" enctype="multipart/form-data" method="post">
<p align="center">文件上传 <input type="File" name="fileupload" value="upload" /> <input type="submit" value="上传"> <input type="reset" value="取消"> </p> </form> </body> </html>
很简单,在选择上传文件后,此页面会转向FileUploadAction.do,这个类负责完成文件的上传功能,具体代码如下:
package com.atools.budget.TestTree.action;
import com.atools.ggcw.action.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.commons.fileupload.*; import org.apache.commons.io.*; import java.io.*; import java.util.*; /** * @author hh * */ public class FileUploadAction extends BaseAction { public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response ) { ActionForward forward=null; try { System.out.println("start"); DiskFileUpload upload=new DiskFileUpload(); List uploadlist=upload.parseRequest(request); // System.out.println("list is "+uploadlist); Iterator iter=uploadlist.iterator(); while(iter.hasNext()) { FileItem item=(FileItem)iter.next(); if(!item.isFormField()) { String filename=item.getName(); filename=FilenameUtils.getName(filename); if(!filename.equals("")) { System.out.println("start"+filename); String savepath="D:\\temp\\"+filename; System.out.println("savepath is "+savepath); File saveFilepath=new File(savepath); item.write(saveFilepath); forward=mapping.findForward("success"); }else forward=mapping.findForward("error"); } } }catch(Exception ex) { ex.printStackTrace(); System.out.println("程序发生错误,抛出异常为 "+ex.getMessage()); } return forward; } } 两个转向页面success.jsp和error.jsp很简单,这里就不写了.作者测试了一下上传200M的文件很快就完成了,而Smartupload 的根本实现不了200M左右文件的上传
在笔者查资料的时候,发现很多都是这样写的
<%@ page language=“java”contentType=“text/html;charset=GBK”%> <%@ page import=“java.util.*”%> <%@ page import=“org.apache.commons.fileupload.*”%> <html> <head> <title>文件上传</title> </head> <% DiskFileUpload fu = new DiskFileUpload(); // 设置允许用户上传文件大小,单位:字节 fu.setSizeMax(10000000); // 设置最多只允许在内存中存储的数据,单位:字节 fu.setSizeThreshold(4096); // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录 fu.setRepositoryPath(“D:\\Tomcat5\\TEMP”); //开始读取上传信息 List fileItems = fu.parseRequest(request); // 依次处理每个上传的文件 Iterator iter = fileItems.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); //忽略其他不是文件域的所有表单信息 if (!item.isFormField()) { String name = item.getName(); item.write(“D:\\UploadTest\\”+ name); } } %>
其中直接得到文件名 item.getName();
然后将其写入item.write(“D:\\UploadTest\\”+ name);是不对的,因为item.getName()得到的文件名是包括上传路径的,比如E:\work.doc,在写入的时候D:\\UploadTest\+E:\work.doc肯定是不对的,还有一点实例item的write()方法要求传入的参数为File类的实例.
以上用到的两个jar包可以到 1:commons-fileupload http://jakarta./site/downloads/downloads_commons-fileupload.cgi
2:Commons-IO http://jakarta./commons/io/ 去下载.
里面有很多东西还在琢磨,有知道的朋友也可以交流
|