2019獨角獸企業重金招聘Python工程師標準>>>
Spring文件上傳
- 1、所需依賴包:commons-fileupload-1.3.1.jar
- 2、Maven配置文件pom.xml文件中加入依賴Jar包
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version></dependency>
- 3、在spring的配置文件spring-mvc.xml中加入類型解析器
<!-- 上傳定義 --><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?
- 4、文件上傳接口
@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值,否則多文件時接收不到