1. 程式人生 > >使用表單上傳檔案(二)

使用表單上傳檔案(二)

先寫一個簡單的表單,根據上一篇文章說的步驟進行

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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> <form enctype="multipart/form-data" action="${pageContext.request.contextPath }/servlet/uploadServlet3" method="post"> <input type="text" name="info"></br> <input type="file" name="files">
</br> <input type="file" name="photo"></br> <input type="submit" value="提交"> </form> </body> </html>

接著寫處理表單提交內容的uploadServlet3.java類

package coml.qianfeng.web.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import
java.io.InputStream; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Date; 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.FileUploadBase; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.FilenameUtils; import com.qianfeng.util.UUIDUtil; public class UploadServlet3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //判斷表單提交資料型別 boolean ismultipartForm = ServletFileUpload.isMultipartContent(request); if(!ismultipartForm){ throw new RuntimeException("Your form's Content-Type is not multipart/form-data"); } //建立工廠類物件 DiskFileItemFactory factory = new DiskFileItemFactory(); //設定臨時檔案的存放位置 factory.setRepository(new File("e:\\filestemp")); //建立檔案上傳物件 ServletFileUpload fileUpload = new ServletFileUpload(factory); fileUpload.setHeaderEncoding("utf-8");//設定上傳的中文亂碼,而普通文字框中的中文亂碼不能解決,可以在下面解決 //把表單提交過來的資料解析把每個資料封裝成FileItem物件 try { fileUpload.setFileSizeMax(1024*1024*3);//設定上傳檔案的大小不能超過3M fileUpload.setSizeMax(1024*1024*5);//控制上傳檔案的總大小 //把表單提交過來的資料解析,把每個資料項封裝成FileItem物件 List<FileItem > fileItems = fileUpload.parseRequest(request); //獲取每項資料 for(FileItem item:fileItems){ //判斷是否是普通的資料項 if(item.isFormField()){ processFormField(item); }else{ processFileUpload(item); } } }catch(FileUploadBase.SizeLimitExceededException e){ System.out.println("警告,上傳檔案的總大小不能超過5M"); } catch(FileUploadBase.FileSizeLimitExceededException e){ System.out.println("警告,檔案不能超過3M"); } catch (Exception e) { e.printStackTrace(); } } //處理普通表單項的方法 private void processFormField(FileItem item){ //得到名字 String name = item.getFieldName(); //得到值 String value=""; try { value = item.getString("utf-8");//處理普通文字的中文亂碼問題 } catch (UnsupportedEncodingException e) { e.printStackTrace(); } System.out.println(name+"="+value); } //處理上傳檔案的方法 private void processFileUpload(FileItem item){ //得到上傳的檔案 String fileName = item.getName(); //在應用的目錄下建立儲存上傳檔案的目錄 String storeDirectory = this.getServletContext().getRealPath("/WEB-INF/upload"); File realDirectory = new File(storeDirectory); if(!realDirectory.exists()){ realDirectory.mkdirs(); } try { //讀取檔案的讀取流 //InputStream in = item.getInputStream(); //String fileName = item.getName();ie瀏覽器:F:\pic\deng.jpg 火狐:deng.jpg 為了相容處理一下檔名 //擷取檔名 //fileName = fileName.substring(fileName.lastIndexOf(File.separator)+1); fileName=FilenameUtils.getName(fileName);//使用工具類處理檔名 //處理檔案同名問題 fileName = UUIDUtil.getUUID()+"_"+fileName; //如果是大網站沒聽有很大的訪問量,上傳很多圖片 //還需要處理把檔案放在不同的資料夾下 //String childDirectory = getChildDirectory(realDirectory); //如果每天的訪問量都很大,同一天需要建立多個資料夾 String childDirectory = getChildDirectory2(realDirectory,fileName); // File fileDir = new File(realDirectory,childDirectory+File.separator+fileName); // FileOutputStream fos = new FileOutputStream(fileDir); // 實現把檔案寫入指定資料夾,同時有刪除臨時檔案的功能,這一行可以代替下面註釋的多行程式碼 item.write( new File(realDirectory,childDirectory+File.separator+fileName)); // byte[] arr = new byte[1024]; // int len=0; // while((len=in.read(arr))!=-1){ // fos.write(arr,0,len); // } // //刪除臨時檔案 // item.delete(); // in.close(); // fos.close(); } catch (Exception e) { } } //建立子目錄:用雜湊值 private String getChildDirectory2(File realDirectory,String fileName) { int hashCode = fileName.hashCode(); String code = Integer.toHexString(hashCode);//把雜湊值轉成十六進位制 String childDirectory = code.charAt(0)+File.separator+code.charAt(1);// a/b File dir = new File(realDirectory,childDirectory); if(!dir.exists()){ dir.mkdirs(); } return childDirectory; } //建立子目錄:用時間 private String getChildDirectory(File realDirectory) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = new Date(); String time=sdf.format(date); File dir = new File(realDirectory,time); if(!dir.exists()){ dir.mkdirs(); } return time; } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }