上一篇講解了smartupload組件上傳,那么這一篇我們講解commons-FileUpload組件上傳
FileUpload是Apache組織(www.apache.org)提供的免費(fèi)的上傳組件,可以直接從Apache站點(diǎn)上下載(下載地址:http://commons.apache.org/fileupload/),本文使用的版本是1.2.1,但是FileUpload組件本身還依賴于commons組件,所以從Apache下載此組件的時(shí)候還需要連同commons組件的IO包一起下載(下載地址:http://commons.apache.org/io/)commons-fileUpload上傳組件對(duì)中文進(jìn)行了良好的處理,對(duì)上傳文件不會(huì)出現(xiàn)中文亂碼問題,是目前最廣泛的組件,將commons-fileupload-1.2.1.jar和commons-io-1.4.jar配置到TOMCAT_HOME/lib/目錄中³FileUpload的具體上傳操作與SmartUpload相比有著很高的復(fù)雜度,下面來看一看FileUpload上傳的基本步驟:<html><head><title>commons-FileUpload組件上傳</title></head><body><form action="fileupload_demo01.jsp" method="post" enctype="multjsp代碼
<%@ page contentType="text/html" pageEncoding="GBK"%><%@ page import="java.util.*"%><%@ page import="org.apache.commons.fileupload.*"%><%@ page import="org.apache.commons.fileupload.disk.*"%><%@ page import="org.apache.commons.fileupload.servlet.*"%><html><head><title>commons-FileUpload組件上傳</title></head><body><% DiskFileItemFactory factory = new DiskFileItemFactory() ; ServletFileUpload upload= new ServletFileUpload(factory) ; upload.setFileSizeMax(3 * 1024 * 1024) ; // 只能上傳3M List<FileItem> items = upload.parseRequest(request) ; // 接收全部?jī)?nèi)容 Iterator<FileItem> iter = items.iterator() ; while(iter.hasNext()){ FileItem item = iter.next() ; String fieldName = item.getFieldName() ; // 取得表單控件的名稱%> <ul><h4><%=fieldName%> --> <%=item.isFormField()%></h4><% if(!item.isFormField()){ // 不是普通文本 String fileName = item.getName() ; // 取得文件的名稱 String contentType = item.getContentType() ; // 文件類型 long sizeInBytes = item.getSize() ;%> <li>上傳文件名稱:<%=fileName%> <li>上傳文件類型:<%=contentType%> <li>上傳文件大小:<%=sizeInBytes%><% } else { String value = item.getString() ;%> <li>普通參數(shù):<%=value%><% }%> </ul><% }%></body></html>組件上傳代碼實(shí)例二
<html><head><title>commons-FileUpload組件上傳</title></head><body><form action="fileupload_demo02.jsp" method="post" enctype="multipart/form-data"> 姓名:<input type="text" name="uname"><br> 照片:<input type="file" name="pic1"><br> 照片:<input type="file" name="pic2"><br> 照片:<input type="file" name="pic3"><br> <input type="submit" value="上傳"> <input type="reset" value="重置"></form></body></html>JSP代碼
<%@ page contentType="text/html" pageEncoding="GBK"%><%@ page import="java.util.*,java.io.*"%><%@ page import="org.apache.commons.fileupload.*"%><%@ page import="org.apache.commons.fileupload.disk.*"%><%@ page import="org.apache.commons.fileupload.servlet.*"%><%@ page import="cn.mldn.lxh.util.*"%><html><head><title>commons-fileUpload組件上傳實(shí)例二</title></head><body><% DiskFileItemFactory factory = new DiskFileItemFactory() ; factory.setRepository(new File(this.getServletContext().getRealPath("/") + "uploadtemp")) ; // 更準(zhǔn)確的說是一個(gè)臨時(shí)文件 ServletFileUpload upload = new ServletFileUpload(factory) ; upload.setFileSizeMax(3 * 1024 * 1024) ; // 只能上傳3M List<FileItem> items = upload.parseRequest(request) ; // 接收全部?jī)?nèi)容 Iterator<FileItem> iter = items.iterator() ; IPTimeStamp its = new IPTimeStamp(/* request.getRemoteAddr() */) ; while(iter.hasNext()){ FileItem item = iter.next() ; String fieldName = item.getFieldName() ; // 取得表單控件的名稱%> <ul><h4><%=fieldName%> --> <%=item.isFormField()%></h4><% if(!item.isFormField()){ // 不是普通文本 File saveFile = null ; InputStream input = null ; OutputStream output = null ; input = item.getInputStream() ; output = new FileOutputStream(new File(this.getServletContext().getRealPath("/")+"upload"+File.separator+its.getIPTimeRand()+"."+item.getName().split("http://.")[1])) ; int temp = 0 ; byte data[] = new byte[512] ; while((temp=input.read(data,0,512))!=-1){ output.write(data) ; // 分塊保存 } input.close() ; output.close() ; } else { String value = item.getString() ;%> <li>普通參數(shù):<%=value%><% }%> </ul><% }%></body></html>注意:本代碼在建立項(xiàng)目時(shí)需要在項(xiàng)目名稱下創(chuàng)建upload文件夾才能正常運(yùn)行。
FileUpload組件的不便之處:
- 無法像使用request.getParameter()方法那樣準(zhǔn)確的取得提交的參數(shù);
- 無法像使用request.getParameterValues()那樣準(zhǔn)確的取得一組提交參數(shù);
- 所有的上傳文件都需要進(jìn)行依次的判斷,才能夠分別保存,不能一次性批量保存。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注