本篇文章給大家分享的是有關(guān)在Java項(xiàng)目中使用fileupload組件如何實(shí)現(xiàn)一個(gè)文件上傳功能,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
創(chuàng)新互聯(lián)公司于2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元興安盟烏蘭浩特做網(wǎng)站,已為上家服務(wù),為興安盟烏蘭浩特各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575
使用fileupload組件的原因:
Request對(duì)象提供了一個(gè)getInputStream()方法,通過(guò)這個(gè)方法可以讀取到客戶端提交過(guò)來(lái)的數(shù)據(jù),但是由于用戶可能會(huì)同時(shí)上傳多個(gè)文件,在servlet中編程解析這些上傳數(shù)據(jù)是一件非常麻煩的工作。為方便開發(fā)人員處理文件上傳數(shù)據(jù),Apache開源組織提供了一個(gè)用來(lái)處理表單文件上傳的一個(gè)開源組件(Commons-fileupload),該組件性能優(yōu)異,并且使用及其簡(jiǎn)單,可以讓開發(fā)人員輕松實(shí)現(xiàn)web文件上傳功能。
使用Commons-fileupload組件實(shí)現(xiàn)文件上傳,需要導(dǎo)入該組件相應(yīng)的支撐jar包:
commons-fileupload和connons-io
(commons-upload組件從1.1版本開始,它的工作需要commons-io包的支持)
FileUpload組件工作流程:
相應(yīng)的代碼框架為:
package pers.msidolphin.uploadservlet.web; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.List; import java.util.UUID; 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.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; /** * Servlet implementation class UploadServlet */ public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public UploadServlet() { super(); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲取解析工廠 DiskFileItemFactory factory = new DiskFileItemFactory(); //得到解析器 ServletFileUpload parser = new ServletFileUpload(factory); //解決文件名亂碼問(wèn)題 parser.setHeaderEncoding("UTF-8"); //判斷上傳表單類型 if(!ServletFileUpload.isMultipartContent(request)) { return; } try { //調(diào)用解析器解析上傳數(shù)據(jù) List<FileItem> fileItems = parser.parseRequest(request); //獲得保存上傳文件目錄的路徑 String uploadPath = request.getServletContext().getRealPath("/WEB-INF/upload"); //遍歷List集合 for (FileItem fileItem : fileItems) { //判斷是否為普通表單字段 if(fileItem.isFormField()) { //如果是普通表單字段則打印到控制臺(tái) if(fileItem.getString() == null || "".equals(fileItem.getString().trim())) { continue; } System.out.println(fileItem.getFieldName() + " = " + new String(fileItem.getString().getBytes("ISO-8859-1"), "UTF-8")); }else { //獲得文件路徑 String filePath = fileItem.getName(); //如果并未上傳文件,繼續(xù)處理下一個(gè)字段 if(filePath == null || "".equals(filePath.trim())) { continue; } System.out.println("處理文件:" + filePath); //截取文件名 String fileName = filePath.substring(filePath.lastIndexOf("\\") + 1); String reallyName = this.createFileName(fileName); String reallyPath = this.mkDir(reallyName, uploadPath); //下面都是普通的IO操作了 InputStream in = fileItem.getInputStream(); FileOutputStream out = new FileOutputStream(reallyPath + "\\" + reallyName); byte[] buffer = new byte[1024]; int len = 0; while((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } out.close(); in.close(); } } System.out.println("處理完畢..."); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } //隨機(jī)產(chǎn)生唯一的文件名 private String createFileName(String fileName) throws NoSuchAlgorithmException, UnsupportedEncodingException { String extension = fileName.substring(fileName.lastIndexOf(".")); MessageDigest md = MessageDigest.getInstance("md5"); String currentTime = System.currentTimeMillis() + ""; return UUID.randomUUID() + currentTime + extension; } //根據(jù)哈希值產(chǎn)生目錄 private String mkDir(String fileName, String uploadPath) { int hasCode = fileName.hashCode(); //低四位作為一級(jí)目錄 int parentDir = hasCode & 0xf; //二級(jí)目錄 int childDir = hasCode & 0xff >> 2; File file = new File(uploadPath + "\\" + parentDir + "\\" + childDir); if(!file.exists()) { file.mkdirs(); } uploadPath = uploadPath + "\\" + parentDir + "\\" + childDir; return uploadPath; } }
JSP頁(yè)面 :
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <fmt:setBundle basename="pers.msidolphin.uploadservlet.lang.locale" var="bundle" scope="page"/> <form action="<c:url value="/UploadServlet"/>" method="post" enctype="multipart/form-data"> <fmt:message key="username" bundle="${bundle}"/><input type="text" name="username"/> <br/> <br/> <fmt:message key="file1" bundle="${bundle}"/><input type="file" name="file1"/> <br/> <br/> <fmt:message key="file2" bundle="${bundle}"/><input type="file" name="file2"/> <br/> <br/> <input type="submit" value="<fmt:message key="submit" bundle="${bundle}"/>"/> </form> </body> </html>
核心API: DiskFileItemFactory類
//設(shè)置內(nèi)存緩沖區(qū)的大小,默認(rèn)為10K,當(dāng)上傳文件大小大于緩沖區(qū)大小,fileupload組件將使用臨時(shí)文件緩存上傳文件 public void setSizeThreshold(int sizeThreshold); //指定臨時(shí)文件目錄 默認(rèn)值為System.getProperty("java.io.tmpdir") public void setRepository(java.io.file respository); //構(gòu)造方法 public DiskFileItemFactory(int sizeThreshold, java.io.file respository);
核心API: ServletFileUpload類
//判斷上傳表單是否為multipart/form-data類型 boolean isMultipartContent(HttpServletRequest request); //解析request對(duì)象,并把表單中的每一個(gè)輸入項(xiàng)包裝成一個(gè)fileitem對(duì)象,返回這些對(duì)象的list集合 List<FileItem> parseRequest(HttpServletRequest request); //設(shè)置上傳文件總量的最大值 單位:字節(jié) void setSizeMax(long sizeMax); //設(shè)置單個(gè)上傳文件的最大值 單位:字節(jié) void setFileSizeMax(long fileSizeMax); //設(shè)置編碼格式,用于解決上傳文件名的亂碼問(wèn)題 void setHeaderEncoding(String encoding); //設(shè)置文件上傳監(jiān)聽器,作用是實(shí)時(shí)獲取已上傳文件的大小 void setProgressListener(ProgressListener pListener);
核心API: FileItem類
//判斷表單輸入項(xiàng)是否為普通輸入項(xiàng)(非文件輸入項(xiàng),如果是普通輸入項(xiàng)返回true boolean isFormField(); //獲取輸入項(xiàng)名稱 String getFieldName(); //獲得輸入項(xiàng)的值 String getString(); String getString(String encoding); //可以設(shè)置編碼,用于解決數(shù)據(jù)亂碼問(wèn)題 以下是針對(duì)非普通字段的: //獲取完整文件名(不同的瀏覽器可能會(huì)有所不同,有的可能包含路徑,有的可能只有文件名) String getName(); //獲取文件輸入流 InputStream getInputStream();
文件上傳的幾個(gè)注意點(diǎn):
1、上傳文件的文件名亂碼問(wèn)題:ServletFileUpload對(duì)象提供了setHeaderEncoding(String encoding)方法可以解決中文亂碼問(wèn)題
2、上傳數(shù)據(jù)的中文亂碼問(wèn)題:
解決方法一:new String(fileItem.getString().getBytes(“ISO-8859-1”), “UTF-8”)
解決方法二:fileItem.getString(“UTF-8”)
解決方法三:fileItem.getString(request.getCharacterEncoding())
3、上傳文件名的唯一性:UUID、MD5解決方法很多…
4、保存上傳文件的目錄最好不要對(duì)外公開
5、限制上傳文件的大?。?ServletFileUpload對(duì)象提供了setFileSizeMax(long fileSizeMax)和setSizeMax(long sizeMax)方法用于解決這個(gè)問(wèn)題
以上就是在Java項(xiàng)目中使用fileupload組件如何實(shí)現(xiàn)一個(gè)文件上傳功能,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站欄目:在Java項(xiàng)目中使用fileupload組件如何實(shí)現(xiàn)一個(gè)文件上傳功能
本文URL:http://muchs.cn/article2/ihgiic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、網(wǎng)站營(yíng)銷、靜態(tài)網(wǎng)站、動(dòng)態(tài)網(wǎng)站、定制網(wǎng)站、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)