<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency>
<!-- 上傳定義 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 100000 btyes --> <property name="maxUploadSize" value="20971520"/> </bean>
若是沒有配置multipartResolver,將會報:
java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured?
@Controller @Api(value = "FileUploadController", description = "文件上傳控制器") public class FileUploadController { /** * 文件上傳接口方法 * @param multipartFiles 文件 * @param fileType 文件類型 * @param request 請求 * @param response 響應 * @return Map */ @ResponseBody @ApiOperation(value = "文件上傳接口", httpMethod = "POST") @RequestMapping(value = "/common/uploadfile", method = RequestMethod.POST) public ResponseData uploadFile(@RequestParam("file") MultipartFile[] multipartFiles, @RequestParam(required = false) String fileType, HttpServletRequest request, HttpServletResponse response) { /* * 1.若是隻是上傳一個文件,則只須要MultipartFile類型接收文件便可,並且無需顯式指定@RequestParam註解 * 2.若是想上傳多個文件,那麼這裏就要用MultipartFile[]類型來接收文件,而且還要指定@RequestParam註解 * 3.上傳多個文件時,前臺頁面中的全部<input type="file"/>的name都應該是multipartFiles,不然參數裏的multipartFiles沒法獲取到全部上傳的文件 * 4.多種格式文件上傳,日期分文件夾,資質文件放到特定文件夾 */ //記錄上傳過程信息,返回前臺 List<FileUploadEntity> list = new ArrayList<>(); String dirName ; // 上傳文件保存的路徑 if("qualification".equals(fileType)){ // 資質文件存放到特定文件夾 dirName = "qualification"; } else { // 其餘格式文件存放到日期命名文件夾 dirName = DateUtil.newDateString("yyyy-MM-dd"); } /* * 判斷是否存在文件夾 */ //若是用的是Tomcat服務器,則文件會上傳到{服務發佈位置}/upload/文件夾下 String realPath = request.getSession().getServletContext().getRealPath("/upload/" + dirName); File realPathDir = new File(realPath); if(!realPathDir.isDirectory() && !realPathDir.exists()){ realPathDir .mkdirs(); } /* * 多文件循環遍歷上傳 */ for (MultipartFile multipartFile : multipartFiles) { //記錄上傳過程信息,返回前臺 FileUploadEntity fileUploadEntity = new FileUploadEntity(); if (!multipartFile.isEmpty()) { // 惟一化文件名 String newFileName = UUID.randomUUID().toString().replaceAll("-", ""); // 獲取源文件拓展名 String fileExtensionName = FileUtil.getFileExtensionName(multipartFile.getOriginalFilename()); // 拼接拓展名 newFileName = StringUtils.isNotEmpty(fileExtensionName) ? newFileName + "." + fileExtensionName : multipartFile.getOriginalFilename(); // 文件相對路徑 String relativePath = "/upload/" + dirName + "/" + newFileName; fileUploadEntity.setCode(200); fileUploadEntity.setFileName(multipartFile.getOriginalFilename()); fileUploadEntity.setFilePath(relativePath); fileUploadEntity.setUploadDate(DateUtil.newDateString(DateUtil.TIME_FORMAT_FULL)); try { //這裏沒必要處理IO流關閉的問題,由於FileUtils.copyInputStreamToFile()方法內部會自動把用到的IO流關掉 //FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), new File(realPath, multipartFile.getOriginalFilename())); //這裏沒必要處理IO流關閉的問題,由於transferTo方法的實現中會自動關閉IO流 multipartFile.transferTo(new File(realPath, newFileName)); } catch (IOException e) { e.printStackTrace(); fileUploadEntity.setCode(500); } list.add(fileUploadEntity); } } return ResponseData.ok(list); } }
注意:@RequestParam("file")這裏必須加入value值,不然多文件時接收不到java