網(wǎng)上看了很多樣例,但是有很多都是過(guò)時(shí)的,里面使用的包中的FileUpload類在新的1.2里面已經(jīng)改變,所以我們不能照搬原來(lái)的方法 ,除非你放棄使用新版本的jar包。 2.1 jsp方式上傳 upload.jsp <%@ page language="java" %> <%@ page contentType = "text/html;charset=gb2312"%> <html> <head> <title>文件上傳演示</title> </head> <body bgcolor="#FFFFFF" text="#000000" leftmargin="0" topmargin="40" marginwidth="0" marginheight="0"> <center> <h1>文件上傳演示</h1> <form name="uploadform" method="POST" action="save.jsp" ENCTYPE="multipart/form-data"> <table border="1" width="450" cellpadding="4" cellspacing="2" bordercolor="#9BD7FF"> <tr><td width="100%" colspan="2"> 文件1:<input name="file1" size="40" type="file"> </td></tr> <tr><td width="100%" colspan="2"> 文件2:<input name="file2" size="40" type="file"> </td></tr> <tr><td width="100%" colspan="2"> 文件3:<input name="file3" size="40" type="file"> </td></tr> </table> <br/><br/> <table> <tr><td align="center"><input type="submit" name="submit" value="開始上傳"/></td></tr> </table> </form> </center> </body> </html> 該文件唯一要注意的地方就是紅色粗體的地方,其他的沒有什么區(qū)別。而正是在這個(gè)奇怪的參數(shù)上,我們利用servlet處理表單的時(shí)候就帶來(lái)了一個(gè)特殊的處理方式(見后分析); save.jsp <%@ page language="java" contentType="text/html;charset=GBK"%> <%@ page import="java.util.*"%> <%@ page import="java.io.*"%> <%@ page import="org.apache.commons.fileupload.*"%> <html> <head> <title>保存上傳文件</title> </head> <body bgcolor=‘#FFFFFF‘ text=‘#000000‘ leftmargin=‘0‘ topmargin=‘40‘ marginwidth=‘0‘ marginheight=‘0‘> <font size=‘6‘ color=‘blue‘>文件列表:</font> <center> <table cellpadding=0 cellspacing=1 border=1 width=‘100%‘> <tr> <td bgcolor=#008080>文件名</td> <td bgcolor=#008080>大小</td> </tr> <% String msg = ""; DiskFileUpload fu = new DiskFileUpload(); // 設(shè)置允許用戶上傳文件大小,單位:字節(jié) // fu.setSizeMax(10000000); // 設(shè)置最多只允許在內(nèi)存中存儲(chǔ)的數(shù)據(jù),單位:字節(jié) // fu.setSizeThreshold(4096); // 設(shè)置一旦文件大小超過(guò)getSizeThreshold()的值時(shí)數(shù)據(jù)存放在硬盤的目錄 //(臨時(shí)存放目錄,文件上傳完畢后有辦法清除它嗎?) fu.setRepositoryPath("D:\\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();//獲取上傳的文件名 long size = item.getSize();//獲取上傳的文件大小(字節(jié)為單位) if((name==null||name.equals("")) && size==0) continue;//跳到while檢查條件 out.println("<tr>"); out.println("<td>" + name + "</td>"); out.println("<td>" + size + "</td>"); //以下為文件名處理,將上傳的文件保存在項(xiàng)目所在目錄下。 //獲取文件名字符串的長(zhǎng)度 int end = name.length(); //返回在此字符串中最右邊出現(xiàn)的指定子字符串的索引。 int begin = name.lastIndexOf("\\"); File savedFile = new File("c:\\TEMP", name.substring(begin+1,end)); item.write(savedFile); } } %> </table> <br><br> <a href="upload.jsp">返回上傳頁(yè)面</a> </center> </body> </html> 以上兩個(gè)文件均是來(lái)自網(wǎng)上,我已經(jīng)做了局部修改。 2. SERVLET的處理 前面提到了那個(gè)特殊的form 參數(shù)ENCTYPE="multipart/form-data",我在做servlet的時(shí)候用通常的request.getParameter("id"),無(wú)法捕捉到該form 表單的值。我們要特殊處理這個(gè)表單。 以下截取的部分servlet內(nèi)容: 假設(shè) 我的form里面有 id,serid,adjunctname 3個(gè)name,而adjunctname的type是file的,其他的是text的。 String id = ChineseString.chineseStr(request.getParameter("id")); String serid = ChineseString.chineseStr(request.getParameter("serid")); String adjunctname = ChineseString.chineseStr(request .getParameter("adjunctname"));
String oldFile = ChineseString.chineseStr(request .getParameter("oldFile")); String downLoadFile = ChineseString.chineseStr(request .getParameter("downLoadFile")); if (ServletFileUpload.isMultipartContent(request)) { // Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory(); // Set factory constraints factory.setSizeThreshold(20 * 1024); factory.setRepository(factory.getRepository()); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // Set overall request size constraint upload.setFileSizeMax(20 * 1024 * 1024); List formlists = null; try { formlists = upload.parseRequest(request); } catch (FileUploadException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } Iterator iter = formlists.iterator(); while (iter.hasNext()) { FileItem formitem = (FileItem) iter.next(); if (!formitem.isFormField()) { String name = ChineseString.chineseStr(formitem.getName()); adjunctsize = new Long(formitem.getSize()).toString(); if ((name == null || name.equals("")) && adjunctsize.equals("0")) continue; // 獲取純粹的文件名 adjunctname = name.substring(name.lastIndexOf("\\") + 1); String suffixName = "." + adjunctname.substring(adjunctname .lastIndexOf(".") + 1); newadjunctname = new Long(GetTime.getSystemCalendar()) .toString() + suffixName; // 創(chuàng)建文件 File savefile = new File(IConstant.ADJUNTFILEPATH + newadjunctname); // File savefile=new File("c:\\TEMP" + newadjunctname); // 寫入文件 try { formitem.write(savefile); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ String formname=formitem.getFieldName();//獲取form中的名字 String formcontent=formitem.getString(); formname=new String(formname.getBytes(),"gb2312"); formcontent=new String(formcontent.getBytes(),"gb2312"); if (formname.equals("id")){ id = formcontent; }else if(formname.equals("serid")){ serid = formcontent; } } } } 當(dāng)我提交頁(yè)面時(shí)得到的id 和serid 均是空的,于是做了這樣的一個(gè)處理 if (!formitem.isFormField()) 判斷是否是文件域,如果不是轉(zhuǎn)向文本域處理 String formname=formitem.getFieldName();//獲取form中的名字 String formcontent=formitem.getString(); formname=new String(formname.getBytes(),"gb2312"); formcontent=new String(formcontent.getBytes(),"gb2312"); if (formname.equals("id")){ id = formcontent; }else if(formname.equals("serid")){ serid = formcontent; } 這樣才能得到正確的form 中id,serid的值 3. 文件名稱或路徑亂碼的處理 在servelet的處理代碼里面,我們看見了一些字符編碼的轉(zhuǎn)換,如: a.String downLoadFile = ChineseString.chineseStr(request .getParameter("downLoadFile")); b.formname=new String(formname.getBytes(),"gb2312"); ChineseString.chineseStr 是自己做的一個(gè)公共的轉(zhuǎn)換函數(shù),內(nèi)容如下: public static String chineseStr(String str) { try { if (str == null) return ""; String tempStr = str; byte[] tempArray = tempStr.getBytes("ISO8859-1"); String temp = new String(tempArray); return temp; } catch (Exception ex) { System.out .println("Exception : com.sclh.common.ChineseString/chineseStr() " + ex.getMessage()); } return ""; } 4. 下載頁(yè)面 有了上傳頁(yè)面,我們?cè)谔砑右粋€(gè)下載的頁(yè)面: <%@ page contentType="text/html;charset=gb2312" language="java" %> <%@ page import="java.io.*"%> <%@ page import="com.sclh.rsp.servicecenter.commom.*"%> <%@ include file="../common.jsp"%> <% String downLoadFile = IConstant.ADJUNTFILEPATH+ChineseString.nullToStr(request.getParameter("downLoadFile")); String oldFile = request.getParameter("oldFile"); //oldFile=oldFile.replaceAll(";", ""); if((oldFile.length())>50){ oldFile=oldFile.substring(0,20); } if (!"".equals(downLoadFile)) { String fullFileName = downLoadFile; File file = new File(fullFileName); if (file.exists()) { try { FileInputStream fileContext = new FileInputStream(fullFileName); BufferedInputStream inStream = new BufferedInputStream(fileContext); response.reset(); response.setContentType("application/x-msdownload"); oldFile = java.net.URLEncoder.encode(oldFile, "utf-8"); response.setHeader("Content-Disposition", "attachment; filename="+ oldFile); // response.setHeader("content-encoding","gzip"); // response.setHeader("content-encoding","compress"); OutputStream sOut = response.getOutputStream(); byte[] b = new byte[4096]; int len = 0; while ( (len = inStream.read(b)) != -1) { sOut.write(b, 0, len); } sOut.close(); } catch (IOException ex) { //System.out.println("Exception : downLoad.jsp " + ex.getMessage()); } } else { response.sendRedirect("error.jsp?closeFlag=1&message=" + ChineseString.URLEncode("下載的文件不存在!")); } } else { response.sendRedirect("error.jsp?closeFlag=1&message=" + ChineseString.URLEncode("下載文件時(shí)參數(shù)錯(cuò)誤!")); }%> 這個(gè)文件中的oldFile和 downLoadFile 就是為了解決下載亂碼和下載文件名稱而做的參數(shù)。如果缺少oldFile的處理 文件將會(huì)顯示的下載名稱為DownLoad.jsp。 而IConstant.ADJUNTFILEPATH 變量定義的是附件存放的地方,在使用中定義 以下是還涉及到下載頁(yè)面的部分jsp代碼: <td class="listcontent" width="17%" height="24" valign="middle" align="center"><a class=listlink href="javascript:onclick=confirmDel(‘<%=entity[i].getId()%>‘,‘<%=intPage%>‘)">刪除</a>|<a class=listlink href="#" onClick="location.href=‘/AdjunctDataServlet?id=<%=entity[i].getId()%>&page=<%=intPage%>&action=update‘">修改</a>|<a class=listlink href="javascript:onclick=downfile(‘<%=entity[i].getAdjunctname()%>‘,‘<%=entity[i].getNewadjunctname()%>‘)">下載</a></td> function downfile(oldFile,downLoadFile) { location.href="/AdjunctDataServlet?action=downLoadFile&oldFile="+oldFile+"&downLoadFile="+downLoadFile; } Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1593398 |
|
來(lái)自: 不會(huì)游泳的魚 > 《Java》