檔案上傳功能的實現
前提:拷入兩個包:
一、Jsp頁面設定:
製作表單:
<form action="${pageContext.request.contextPath}/AddProdServlet" method="post"enctype="multipart/form-data">
<table border="1">
<tr>
<td>商品圖片</td>
</tr>
<tr>
<tdcolspan="2"><input type="submit"value="新增商品"/></td>
</tr
</table>
</form>
二.Servlet操作:
//建立map物件放置檔案上傳名和值
Map<String, String> map = new HashMap<String,String>();
//建立DiskFileItemFactory物件,設定緩衝區大小和檔案目錄
DiskFileItemFactory factory = newDiskFileItemFactory()
factory.setSizeThreshold(1024*100);
factory.setRepository(
.getRealPath("/WEB-INF/tmp")));
// 使用DiskFileItemFactory物件建立ServletFileUpload物件,並設定上傳檔案的大小限制。
ServletFileUpload fileUpload = new ServletFileUpload(factory);
//檢查是否是正確的檔案上傳表單(使用isMultipartContent可以判斷是普通表單還是帶有檔案的表單)
if(!fileUpload.isMultipartContent(request))
{
thrownew RuntimeException("請用正確的表單進行上傳");
}
//設定單個檔案上傳的大小
fileUpload.setFileSizeMax(1024 * 10204 * 5);
//設定檔案上傳的總大小
fileUpload.setSizeMax(1024 * 10204 * 200);
//設定編碼,解決上傳檔名的亂碼問題
fileUpload.setHeaderEncoding("utf-8");
//檔案上傳解析請求
List<FileItem> list = fileUpload.parseRequest(request);
//使用增強for迴圈遍歷檔案上傳的內容
for (FileItem item : list) {
//如果當前返回的內容是普通表單的型別
if (item.isFormField()) {
//定義nameame用於返回表單標籤name屬性的值
Stringname = item.getFieldName();
//設定返回的value值是utf-8的格式
Stringvalue = item.getString("utf-8");
//將檔案上傳名和值放置到map中
map.put(name, value);
// System.out.println(name+" "+value);
}else {
//如果不是普通表單的形式
Stringname = item.getName();
// 建立隨機名稱,這樣能夠方便讓上傳檔名唯一
StringuuidName = UUID.randomUUID().toString()+ name;
// System.out.println(uuidName);
// 建立檔案儲存的路徑
Stringpath = this.getServletContext().getRealPath(
"/WEB-INF/upload");
//在系統中利用hashCode值,這樣才能確保圖片上傳是唯一的
inthashCode = uuidName.hashCode();
//將hashCode值轉換成十六進位制的字串
StringhashStr = Integer.toHexString(hashCode);
//將獲得的字串轉換成陣列
charhss[] = hashStr.toCharArray();
Stringimgurl= "/WEB-INF/upload";
//遍歷,這樣可以讓檔案包分配資源合理
for (charc : hss) {
path += "/" + c;
imgurl += "/" + c;
}
imgurl += "/" + uuidName;
map.put("imgurl", imgurl);
new File(path).mkdirs();
System.out.println(path);
// 檔案的讀寫
InputStreamin = item.getInputStream();
OutputStreamout = new FileOutputStream(new File(path,uuidName));
IOUtils.In2Out(in, out);
IOUtils.close(in, out);
// 刪除臨時檔案
item.delete();
PicUtilspicUtils = new PicUtils(path+"/"+uuidName);
picUtils.resizeByHeight(100);
}
}
Prodprod = new Prod();
//將前臺傳過來的資料封裝到javaBean中;
BeanUtils.populate(prod, map);
service.addProd(prod);
//3 提示成功,返回首頁
response.getWriter().write("新增商品成功!3秒回首頁");
response.setHeader("Refresh", "3;url="+request.getContextPath()+"/index.jsp");
}catch (Exception e) {
e.printStackTrace();
}