1. 程式人生 > >servlet組建上傳檔案

servlet組建上傳檔案

表單上傳,普通欄位和檔案都可以接收,返回檔案上傳後的路徑

	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;
	}