多檔案上傳MultipartHttpServletRequest使用
阿新 • • 發佈:2018-12-14
private void parseHttpServletRequest(HttpServletRequest request)throws Exception{ List<String> fileNames = new ArrayList<>(); List<File> fileEntity = new ArrayList<>(); MyFile file = new MyFile(); //建立一個通用的多部分解析器 CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); //判斷 request 是否有檔案上傳,即多部分請求 if(multipartResolver.isMultipart(request)){ //轉換成多部分request MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request; MultiValueMap<String,MultipartFile> multiFileMap = multiRequest.getMultiFileMap(); List<MultipartFile> fileSet = new LinkedList<>(); for(Entry<String, List<MultipartFile>> temp : multiFileMap.entrySet()){ fileSet = temp.getValue(); } for(MultipartFile temp : fileSet){ File file2 = new File("c:/temp/"+temp.getOriginalFilename()); if(!file2.exists()){ file2.mkdirs(); } fileNames.add(temp.getOriginalFilename()); temp.transferTo(file2); fileEntity.add(file2); } file.setFileNames(fileNames); file.setFileEntity(fileEntity); } }
其實上面的程式碼中就是在獲取多個檔案物件時有個比較繞的地方, 通過 multiRequest.getFileNames();//值是Page這個字串 multiRequest.getFileMap(); //會截斷
MultiValueMap <String,MultipartFile> multiFileMap = multiRequest.getMultiFileMap()
中的MultipartFile連結串列,只能獲取一個。
debug時發現request中的MultiFileMap的大小確實是一個,但是這個key對應的value是一個連結串列。 (有個初步猜想,可能是在上傳的檔案是分Page上傳的,檔案較少時就放到一個List(LinkedList)中,檔案較多獲取較大時分頁傳送,具體的閥值沒有測試)