1. 程式人生 > >多檔案上傳MultipartHttpServletRequest使用

多檔案上傳MultipartHttpServletRequest使用

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)中,檔案較多獲取較大時分頁傳送,具體的閥值沒有測試)