1. 程式人生 > >使用jsp/servlet簡單實現檔案上傳與下載

使用jsp/servlet簡單實現檔案上傳與下載

public class UploadServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		System.out.print(request.getRemoteAddr());
		boolean isMultipart = ServletFileUpload.isMultipartContent(request);
		if(!isMultipart){
			throw new RuntimeException("請檢查您的表單的enctype屬性,確定是multipart/form-data");
		}
		DiskFileItemFactory dfif = new DiskFileItemFactory();
		ServletFileUpload parser = new ServletFileUpload(dfif);
		
		parser.setFileSizeMax(3*1024*1024);//設定單個檔案上傳的大小
		parser.setSizeMax(6*1024*1024);//多檔案上傳時總大小限制
		
		List<FileItem> items = null;
		try {
			items = parser.parseRequest(request);
		}catch(FileUploadBase.FileSizeLimitExceededException e) {
			out.write("上傳檔案超出了3M");
			return;
		}catch(FileUploadBase.SizeLimitExceededException e){
			out.write("總檔案超出了6M");
			return;
		}catch (FileUploadException e) {
			e.printStackTrace();
			throw new RuntimeException("解析上傳內容失敗,請重新試一下");
		}
		
		//處理請求內容
		if(items!=null){
			for(FileItem item:items){
				if(item.isFormField()){
					processFormField(item);
				}else{
					processUploadField(item);
				}
			}
		}
		
		out.write("上傳成功!");
	}
	private void processUploadField(FileItem item) {
		try {
			String fileName = item.getName();
			
			
			//使用者沒有選擇上傳檔案時
			if(fileName!=null&&!fileName.equals("")){
				fileName = UUID.randomUUID().toString()+"_"+FilenameUtils.getName(fileName);
				
				//副檔名
				String extension = FilenameUtils.getExtension(fileName);
				//MIME型別
				String contentType = item.getContentType();
				
				
				
				//分目錄儲存:日期解決
	//			Date now = new Date();
	//			DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
	//			
	//			String childDirectory  = df.format(now);
				
				
				//按照檔名的hashCode計算儲存目錄
				String childDirectory = makeChildDirectory(getServletContext().getRealPath("/WEB-INF/files/"),fileName);
				
				String storeDirectoryPath = getServletContext().getRealPath("/WEB-INF/files/"+childDirectory);
				File storeDirectory = new File(storeDirectoryPath);
				if(!storeDirectory.exists()){
					storeDirectory.mkdirs();
				}
				System.out.println(fileName);
				item.write(new File(storeDirectoryPath+File.separator+fileName));//刪除臨時檔案
				
			}
		} catch (Exception e) {
			throw new RuntimeException("上傳失敗,請重試");
		}
		
	}
	//計算存放的子目錄
	private String makeChildDirectory(String realPath, String fileName) {
		int hashCode = fileName.hashCode();
		int dir1 = hashCode&0xf;// 取1~4位
		int dir2 = (hashCode&0xf0)>>4;//取5~8位
		
		String directory = ""+dir1+File.separator+dir2;
		File file = new File(realPath,directory);
		if(!file.exists())
			file.mkdirs();
		
		return directory;
	}
	private void processFormField(FileItem item) {
		String fieldName = item.getFieldName();//欄位名
		String fieldValue;
		try {
			fieldValue = item.getString("UTF-8");
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException("不支援UTF-8編碼");
		}
		System.out.println(fieldName+"="+fieldValue);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

      至此,上傳的任務就基本完成了,有了上傳當然也要有下載功能,在下載之前,我們需要將所有已經上傳的檔案顯示在網頁上,通過一個servlet與一個jsp頁面來顯示,servlet程式碼如下: