使用表單上傳檔案(二)
阿新 • • 發佈:2018-12-23
先寫一個簡單的表單,根據上一篇文章說的步驟進行
<%@ 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);
}
}