用commons-fileupload-1.2 實(shí)現(xiàn)文件上傳(轉(zhuǎn))
先放鏈接:
轉(zhuǎn)載自:http://www.diybl.com/course/3_program/java/javashl/2008520/117162.html
前幾天搞文件上傳, Google到了Apache 的 commons-fileupload-1.2.jar 上傳組件, 研究了API然后結(jié)合Hibernate實(shí)現(xiàn)了上傳圖片 并保存到MySQL數(shù)據(jù)庫(kù). 今天重新寫(xiě)了一遍, 由于不需要保存到數(shù)據(jù)庫(kù)了, 就實(shí)現(xiàn)了保存成文件格式.
??? 我的這個(gè)FileUpload web工程源文件下載如下 : FileUpload.rar . 解壓到當(dāng)前文件夾后直接剪切到 Tomcat 主目錄下的 webapps 目錄下, 啟動(dòng) Tomcat 后在瀏覽器輸入 http://localhost:8080/FileUpload/upload.html 查看演示.
??? 我是用Eclipse 開(kāi)發(fā). 首先, 下載兩個(gè)開(kāi)發(fā)包: commons-fileupload 和 commons-io(這個(gè)在應(yīng)用commons-fileupload時(shí)會(huì)用到). 這兩個(gè)開(kāi)發(fā)包(jar文件) 在我前面提供的FileUpload 工程下的WEB-INF/lib下可以找到, 你也可以到官方下載: 到 http://commons.apache.org/downloads/download_fileupload.cgi 下載 commons-fileupload-1.2.jar 組件包 (直接下載地址: http://apache.mirror.phpchina.com/commons/fileupload/binaries/commons-fileupload-1.2-bin.zip), 到 http://commons.apache.org/downloads/download_io.cgi 下載 commons-io-1.3.2 組件包(直接下載地址: http://apache.mirror.phpchina.com/commons/io/binaries/commons-io-1.3.2-bin.zip).
??? 啟動(dòng)Eclipse, 新建Web Project, 取名 FileUpload. 然后在WebRoot文件夾(Web根文件夾)下新建兩個(gè)文件夾(New->Folder) : ImagesUploaded 和 ImagesUploadTemp, 分別用來(lái)存放上傳文件和上傳時(shí)的臨時(shí)文件,稍后代碼里會(huì)用到.
???? 在WebRoot 文件夾下新建文件upload.html, 用來(lái)提供上傳用的form. 源代碼如下: ???? 右擊src, 新建一個(gè)Servlet: FileUploadServlet, 路徑設(shè)為src/FileUploadServlet . 保存后WebRoot/WEB-INF/web.xml 更新為:
web.xml<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> ??? <description>This is the description of my J2EE component</description> ??? <display-name>This is the display name of my J2EE component</display-name> ??? <servlet-name>FileUploadServlet</servlet-name> ??? <servlet-class>FileUploadServlet</servlet-class> </servlet> <servlet-mapping> ??? <servlet-name>FileUploadServlet</servlet-name> ??? <url-pattern>/FileUploadServlet</url-pattern> </servlet-mapping> <welcome-file-list> ??? <welcome-file>upload.html</welcome-file> </welcome-file-list> </web-app>
?? ??? 其中,我把<welcome-file-list>??? <welcome-file>index.jsp</welcome-file> </welcome-file-list> 的歡迎文件設(shè)為了upload.html, 這樣等完成后可能直接用http://localhost:8080/FileUpload/ 來(lái)訪(fǎng)問(wèn)upload.html. 不改的話(huà), 可以在http://localhost:8080/FileUpload/upload.html 頁(yè)面上傳文件.??? 在寫(xiě)FileUploadServlet 之前, 先將之前下載的commons-fileupload 和commons-io 組件包壓縮文件解壓出來(lái), 把里面的 commons-fileupload-1.2.jar (lib文件夾下) 和 commons-io-1.3.2.jar 拷到WebRoot/WEB-INF/lib 文件夾下, 以便使用它們的功能.
??? FileUploadServlet.java 的源代碼如下, 附有詳細(xì)注解:
FileUploadServlet.java import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class FileUploadServlet extends HttpServlet {
public FileUploadServlet() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
final long MAX_SIZE = 3 * 1024 * 1024;// 設(shè)置上傳文件最大為 3M
// 允許上傳的文件格式的列表
final String[] allowedExt = new String[] { "jpg", "jpeg", "gif", "txt","doc", "docx", "mp3", "wma", "m4a" };
response.setContentType("text/html");
// 設(shè)置字符編碼為UTF-8, 這樣支持漢字顯示
response.setCharacterEncoding("UTF-8");
// 實(shí)例化一個(gè)硬盤(pán)文件工廠(chǎng),用來(lái)配置上傳組件ServletFileUpload
DiskFileItemFactory dfif = new DiskFileItemFactory();
dfif.setSizeThreshold(4096);// 設(shè)置上傳文件時(shí)用于臨時(shí)存放文件的內(nèi)存大小,這里是4K.多于的部分將臨時(shí)存在硬盤(pán)
dfif.setRepository(new File(request.getRealPath("/")+ "ImagesUploadTemp"));// 設(shè)置存放臨時(shí)文件的目錄,web根目錄下的ImagesUploadTemp目錄
// 用以上工廠(chǎng)實(shí)例化上傳組件
ServletFileUpload sfu = new ServletFileUpload(dfif);
// 設(shè)置最大上傳尺寸
sfu.setSizeMax(MAX_SIZE);
PrintWriter out = response.getWriter();
// 從request得到 所有 上傳域的列表
List fileList = null;
try {fileList = sfu.parseRequest(request);
} catch (FileUploadException e) {// 處理文件尺寸過(guò)大異常if (e instanceof SizeLimitExceededException) {out.println("文件尺寸超過(guò)規(guī)定大小:" + MAX_SIZE + "字節(jié)<p />");out.println("<a href=\"upload.html\" target=\"_top\">返回</a>");return;}e.printStackTrace();
}
// 沒(méi)有文件上傳
if (fileList == null || fileList.size() == 0) {out.println("請(qǐng)選擇上傳文件<p />");out.println("<a href=\"upload.html\" target=\"_top\">返回</a>");return;
}
// 得到所有上傳的文件
Iterator fileItr = fileList.iterator();
// 循環(huán)處理所有文件
while (fileItr.hasNext()) {FileItem fileItem = null;String path = null;long size = 0;// 得到當(dāng)前文件fileItem = (FileItem) fileItr.next();// 忽略簡(jiǎn)單form字段而不是上傳域的文件域(<input type="text" />等)if (fileItem == null || fileItem.isFormField()) {continue;}// 得到文件的完整路徑path = fileItem.getName();// 得到文件的大小size = fileItem.getSize();if ("".equals(path) || size == 0) {out.println("請(qǐng)選擇上傳文件<p />");out.println("<a href=\"upload.html\" target=\"_top\">返回</a>");return;}// 得到去除路徑的文件名String t_name = path.substring(path.lastIndexOf("\\") + 1);// 得到文件的擴(kuò)展名(無(wú)擴(kuò)展名時(shí)將得到全名)String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1);// 拒絕接受規(guī)定文件格式之外的文件類(lèi)型int allowFlag = 0;int allowedExtCount = allowedExt.length;for (; allowFlag < allowedExtCount; allowFlag++) {if (allowedExt[allowFlag].equals(t_ext))break;}if (allowFlag == allowedExtCount) {out.println("請(qǐng)上傳以下類(lèi)型的文件<p />");for (allowFlag = 0; allowFlag < allowedExtCount; allowFlag++)out.println("*." + allowedExt[allowFlag]+ "???");out.println("<p /><a href=\"upload.html\" target=\"_top\">返回</a>");return;}long now = System.currentTimeMillis();// 根據(jù)系統(tǒng)時(shí)間生成上傳后保存的文件名String prefix = String.valueOf(now);// 保存的最終文件完整路徑,保存在web根目錄下的ImagesUploaded目錄下String u_name = request.getRealPath("/") + "ImagesUploaded/"+ prefix + "." + t_ext;try {// 保存文件fileItem.write(new File(u_name));out.println("文件上傳成功. 已保存為: " + prefix + "." + t_ext+ " ??文件大小: " + size + "字節(jié)<p />");out.println("<a href=\"upload.html\" target=\"_top\">繼續(xù)上傳</a>");} catch (Exception e) {e.printStackTrace();}
}
}
public void init() throws ServletException {
// Put your code here
}
}
?
??? 保存后部署項(xiàng)目(MyEclipse下直接點(diǎn)擊Deploy J2EE...按鈕, 然后選擇Tomcat服務(wù)器). 沒(méi)有MyEclipse的話(huà), 把WebRoot 拷到 Tomcat 主目錄下的webapps 目錄下, 并重命名為 FileUpload 然后啟動(dòng)Tomcat. (或直接下載我在文章開(kāi)始提供的工程打包rar文件). 最后打開(kāi)瀏覽器, 輸入url:target="_blank" link="http://localhost:8080/FileUpload/upload.html">http://localhost:8080/FileUpload/upload.html .
總結(jié)
以上是生活随笔 為你收集整理的用commons-fileupload-1.2 实现文件上传 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。