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值,否则多文件时接收不到