1. 程式人生 > >檔案上傳功能的實現

檔案上傳功能的實現

前提:拷入兩個包:

一、Jsp頁面設定:

製作表單:

<form action="${pageContext.request.contextPath}/AddProdServlet" method="post"enctype="multipart/form-data">

<table border="1">

<tr>

           <td>商品圖片</td>

          

<td><inputtype="file" name="file1"/></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(

new File(this.getServletContext()

.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();

       }