servlet組建上傳檔案
阿新 • • 發佈:2018-12-21
表單上傳,普通欄位和檔案都可以接收,返回檔案上傳後的路徑
public static String upload(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ String msg=""; String oidValue=""; File file = new File(filePath); if (!file.exists()) { System.out.println(filePath + "目錄不存在,需要建立"); file.mkdirs(); } /** * 使用Apache檔案上傳元件處理檔案上傳步驟: * * */ //設定環境:建立一個DiskFileItemFactory工廠 DiskFileItemFactory factory = new DiskFileItemFactory(); //設定上傳檔案的臨時目錄 // factory.setRepository(new File(tempFilePath));//設定檔案快取目錄 // factory.setSizeThreshold(1024*1024); //核心操作類:建立一個檔案上傳解析器。 ServletFileUpload upload = new ServletFileUpload(factory); //解決上傳"檔名"的中文亂碼 upload.setHeaderEncoding("UTF-8"); //判斷enctype:判斷提交上來的資料是否是上傳表單的資料 if(!ServletFileUpload.isMultipartContent(request)){ msg="不是上傳檔案,程式終止!"; /* request.setAttribute("msg",msg); request.getRequestDispatcher("/jieguo.jsp").forward( request, response);*/ return msg; } //使用ServletFileUpload解析器解析上傳資料,解析結果返回的是一個List<FileItem>集合,每一個FileItem對應一個Form表單資料 try{ List<FileItem> items =upload.parseRequest(request); for(FileItem item:items){ //如果fileitem中封裝的是普通輸入項的資料(輸出名、值) if(item.isFormField()){ String filedName = item.getFieldName();//普通輸入項資料的名 //解決普通輸入項的資料的中文亂碼問題 oidValue = item.getString("UTF-8");//普通輸入項的值 System.out.println("普通欄位:"+filedName+"=="+oidValue); }else{ //如果fileitem中封裝的是上傳檔案,得到上傳的檔名稱, String fileName = item.getName();//上傳檔案的名 System.out.println("檔名=="+fileName); //多個檔案上傳輸入框有空 的 異常處理 if(fileName==null||"".equals(fileName.trim())){ //去空格是否為空 continue;// 為空,跳過當次迴圈, 第一個沒輸入則跳過可以繼續輸入第二個 } //注意:不同的瀏覽器提交的檔名是不一樣的,有些瀏覽器提交上來的檔名是帶有路徑的,如: c:\a\b\1.txt,而有些只是單純的檔名,如:1.txt //處理上傳檔案的檔名的路徑,擷取字串只保留檔名部分。//擷取留最後一個"\"之後,+1截取向右移一位("\a.txt"-->"a.txt") fileName = fileName.substring(fileName.lastIndexOf("\\")+1); int pos = fileName.lastIndexOf("."); String str = fileName.substring(pos+1).toLowerCase(); //判斷上傳檔案必須是zip或者是rar否則不允許上傳 if ((!str.equals("doc"))&&(!str.equals("pdf"))&&(!str.equals("xls"))) { msg="上傳檔案格式錯誤,請上傳.doc(.pdf)(.xls)格式的檔案"; return msg; } //拼接上傳路徑。存放路徑+上傳的檔名 savePath= filePath+File.separatorChar+fileName; //構建輸入輸出流 InputStream in = item.getInputStream(); //獲取item中的上傳檔案的輸入流 File excelFile=new File(savePath); if(!excelFile.exists()){ excelFile.createNewFile(); } OutputStream out = new FileOutputStream(savePath); //建立一個檔案輸出流 //建立一個緩衝區 byte b[] = new byte[1024]; //判斷輸入流中的資料是否已經讀完的標識 int len = -1; //迴圈將輸入流讀入到緩衝區當中,(len=in.read(buffer))!=-1就表示in裡面還有資料 while((len=in.read(b))!=-1){ //沒資料了返回-1 //使用FileOutputStream輸出流將緩衝區的資料寫入到指定的目錄(savePath+"\\"+filename)當中 out.write(b, 0, len); } //關閉流 out.flush(); out.close(); in.close(); //刪除臨時檔案 item.delete();//刪除處理檔案上傳時生成的臨時檔案 msg=savePath; } } }catch(Exception e){ e.printStackTrace(); msg="伺服器繁忙,請稍後再試!"; return msg; } return msg; }