最近項(xiàng)目經(jīng)理逼著讓偶做樹的展開,表嵌套表,可惜偶剛參加工作,水平低,這不在查資料嘛,可是不多久就傳來了經(jīng)理的叫囂聲,這么簡單的東西,都一天了,你還沒做完..................,哎真是郁悶,誰讓咱水平低呢(心想,什么時(shí)候等我水平提高了,看我怎么收拾你,又一想,等我水平提高了,人家早不知道干什么去了,廢話不多說了)
文件上傳一直是B/S結(jié)構(gòu)中很重要的一項(xiàng)功能,在java中并沒有很好的實(shí)現(xiàn)文件上傳的類包,因此出現(xiàn)了一些開源的組件,Smartupload ,commons-fileupload,還有國內(nèi)的一個(gè)"牛人"的(不好意思叫不上名字來),這幾個(gè)組件中Smartupload 出來的時(shí)候應(yīng)該最早,不過現(xiàn)在已經(jīng)不再有新的版本出現(xiàn),還有一個(gè)不足的地方就是Smartupload 支持上傳的文件最大在100M左右,這可滿足不了客戶的需求,聽說commons-fileupload不錯(cuò),經(jīng)過幾番測試終于搞定,下面是代碼,3個(gè)jsp文件 upload.jsp success.jsp error.jsp 一個(gè)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>
很簡單,在選擇上傳文件后,此頁面會(huì)轉(zhuǎn)向FileUploadAction.do,這個(gè)類負(fù)責(zé)完成文件的上傳功能,具體代碼如下:
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("程序發(fā)生錯(cuò)誤,,拋出異常為 "+ex.getMessage()); } return forward; } } 兩個(gè)轉(zhuǎn)向頁面success.jsp和error.jsp很簡單,這里就不寫了.作者測試了一下上傳200M的文件很快就完成了,而Smartupload 的根本實(shí)現(xiàn)不了200M左右文件的上傳
在筆者查資料的時(shí)候,發(fā)現(xiàn)很多都是這樣寫的
<%@ 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(); // 設(shè)置允許用戶上傳文件大小,單位:字節(jié) fu.setSizeMax(10000000); // 設(shè)置最多只允許在內(nèi)存中存儲(chǔ)的數(shù)據(jù),單位:字節(jié) fu.setSizeThreshold(4096); // 設(shè)置一旦文件大小超過getSizeThreshold()的值時(shí)數(shù)據(jù)存放在硬盤的目錄 fu.setRepositoryPath(“D:\\Tomcat5\\TEMP”); //開始讀取上傳信息 List fileItems = fu.parseRequest(request); // 依次處理每個(gè)上傳的文件 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);是不對(duì)的,因?yàn)閕tem.getName()得到的文件名是包括上傳路徑的,比如E:\work.doc,在寫入的時(shí)候D:\\UploadTest\+E:\work.doc肯定是不對(duì)的,還有一點(diǎn)實(shí)例item的write()方法要求傳入的參數(shù)為File類的實(shí)例.
以上用到的兩個(gè)jar包可以到 1:commons-fileupload http://jakarta./site/downloads/downloads_commons-fileupload.cgi
2:Commons-IO http://jakarta./commons/io/ 去下載.
里面有很多東西還在琢磨,有知道的朋友也可以交流
|