2019-03-15
话不多说直接上代码
application.yml:因为Linux环境与Windows环境路径不一致,暂时用Windows环境测试
server:
port: 8891
#文件上传Windows
upload:
path:
#临时目录
temporary: E:/upload/temporary/
#正式目录
formal: E:/upload/formal/
multipart:
#单个文件最大内存
maxFileSize: 512KB
#所有文件最大内存
maxRequestSize: 5MB
#文件上传Linux
#upload:
# path:
# #临时目录
# temporary: /usr/upload/temporary/
# #正式目录
# formal: /usr/upload/formal/
# multipart:
# #单个文件最大内存
# maxFileSize: 512KB
# #所有文件最大内存
# maxRequestSize: 5MB
spring:
resources:
#静态资源访问
static-locations: file:${upload.path.temporary},file:${upload.path.formal}
FilesConfig:读取配置文件中文件上传配置
6 7 /** 8 * @Author Qin 9 * @Date 2019-03-11 13:21 10 */ 11 @Component 12 @Data 13 public class FilesConfig { 14 15 /** 16 * 单文件上传最大内存 17 */ 18 @Value("${upload.multipart.maxFileSize}") 19 private String maxFileSize; 20 21 /** 22 * 多文件上传最大内存 23 */ 24 @Value("${upload.multipart.maxRequestSize}") 25 private String maxRequestSize; 26 27 /** 28 * 文件上传临时目录 29 */ 30 @Value("${upload.path.temporary}") 31 private String temporaryPath; 32 33 /** 34 * 文件上传正式目录 35 */ 36 @Value("${upload.path.formal}") 37 private String formalPath; 38 }
FilesUploadService:文件上传Service,返回文件名称
12 /** 13 * 文件上传 14 * 15 * @Author Qin 16 * @Date 2019-03-11 13:28 17 */ 18 public class UploadService { 19 /** 20 * 文件上传时间 21 * 22 * @return 23 */ 24 public static String getUploudTime() { 25 Date date = new Date(); 26 DateFormat df = new SimpleDateFormat("yyyy/MM/dd"); 27 return df.format(date); 28 } 29 30 /** 31 * 给原文件取新的名称 32 * 33 * @param fileOriginName 34 * @return 35 */ 36 public static String getFileName(String fileOriginName) { 37 return UUID.randomUUID().toString().replace("-", "") + fileOriginName.substring(fileOriginName.lastIndexOf(".")); 38 } 39 40 /** 41 * 单文件上传 42 * 43 * @param file 文件 44 * @param path 文件上传路径 45 * @return 46 * @throws IOException 47 */ 48 public static String uploadOne(MultipartFile file, String path) throws IOException { 49 String uploudTime = UploadService.getUploudTime(); 50 //新的文件存放路径加上新的文件名 51 String newPath = path + uploudTime + "/" + UploadService.getFileName(file.getOriginalFilename()); 52 File file1 = new File(newPath); 53 //判断文件目录是否存在 54 if (!file1.getParentFile().exists()) { 55 //创建文件存放目录 56 //无论是几个/,都是创建一个文件夹 57 //mkdirs(): 创建多层目录,如:E:/upload/2019 58 //mkdir(): 只创建一层目录,如:E:upload 59 //如果不加这一行不会创建新的文件夹,会报系统找不到路径 60 file1.getParentFile().mkdirs(); 61 } 62 //存储文件 63 file.transferTo(file1); 64 //去掉目录名,保留文件总体路径,通过该路径访问图片 65 String filename = newPath.substring(newPath.lastIndexOf(path)).replace(path, ""); 66 return filename; 67 } 68 69 /** 70 * 多文件上传 71 * 72 * @param files 文件 73 * @param path 文件上传路径 74 * @return 75 * @throws IOException 76 */ 77 public static String uploadMore(MultipartFile[] files, String path) throws IOException { 78 //多文件文件名 79 String uploadName = null; 80 String uploudTime = UploadService.getUploudTime(); 81 for (MultipartFile file : files) { 82 //新的文件存放路径加上新的文件名 83 String newPath = path + uploudTime + "/" + UploadService.getFileName(file.getOriginalFilename()); 84 File file1 = new File(newPath); 85 //判断文件目录是否存在 86 if (!file1.getParentFile().exists()) { 87 //创建文件存放目录 88 //无论是几个/,都是创建一个文件夹 89 //mkdirs(): 创建多层目录,如:E:/upload/2019 90 //mkdir(): 只创建一层目录,如:E:upload 91 //如果不加这一行不会创建新的文件夹,会报系统找不到路径 92 file1.getParentFile().mkdirs(); 93 } 94 //存储文件 95 file.transferTo(file1); 96 if (uploadName == null) { 97 uploadName = newPath.substring(newPath.lastIndexOf(path)).replace(path, ""); 98 } else { 99 uploadName = uploadName + "," + newPath.substring(newPath.lastIndexOf(path)).replace(path, ""); 100 } 101 } 102 return uploadName; 103 } 104 }
FilesUploadController:文件上传Controller同时包含文件转移
1 /** 2 * @Author Qin 3 * @Date 2019-03-11 10:54 4 */ 5 @RestController 6 @RequestMapping("/api/file") 7 public class FilesUploadController { 8 9 @Autowired 10 private FilesConfig filesConfig; 11 12 /** 13 * 设置文件上传大小:在配置文件中限定 14 * @return 15 */ 16 @Bean 17 public MultipartConfigElement multipartConfigElement() { 18 MultipartConfigFactory factory = new MultipartConfigFactory(); 19 //单个文件最大 20 factory.setMaxFileSize(filesConfig.getMaxFileSize()); 21 //设置总上传数据总大小 22 factory.setMaxRequestSize(filesConfig.getMaxRequestSize()); 23 return factory.createMultipartConfig(); 24 } 25 26 /** 27 * 单文件上传 28 * @param file 29 * @return 30 * @throws IOException 31 */ 32 @PostMapping("/uploadOne") 33 public JsonResult uploadOne(MultipartFile file) throws IOException { 34 String uploadOne = UploadService.uploadOne(file, filesConfig.getTemporaryPath()); 35 return ResponseResult.Success(ResultCodeEnums.SUCCESS,uploadOne); 36 } 37 38 /** 39 * 多文件上传 40 * @param files 41 * @return 42 * @throws IOException 43 */ 44 @PostMapping("/uploadMore") 45 public JsonResult uploadMore(MultipartFile[] files) throws IOException { 46 String uploadMore = UploadService.uploadMore(files, filesConfig.getTemporaryPath()); 47 String[] uploadMores = uploadMore.split(","); 48 return ResponseResult.Success(ResultCodeEnums.SUCCESS,uploadMores); 49 } 50 51 /** 52 * 文件转移:适用于多文件以及单文件 53 * @param uploadPath 54 * @return 55 * @throws IOException 56 */ 57 @PostMapping("/change") 58 public JsonResult filesChange(@RequestBody String [] uploadPath) throws IOException { 59 //循环遍历传来的String数组 60 for (String u : uploadPath) { 61 //拿到临时目录的文件 62 String path = filesConfig.getTemporaryPath() + u; 63 File file = new File(path); 64 //File类型转换为MultipartFile类型 65 MultipartFile multipartFile = new MockMultipartFile(file.getName(), new FileInputStream(file)); 66 //正式目录名与文件名生成一个新的路径 67 String newPath = filesConfig.getFormalPath() + u; 68 File newFile = new File(newPath); 69 //判断文件目录是否存在 70 if (!newFile.getParentFile().exists()) { 71 //创建文件存放目录 72 //无论是几个/,都是创建一个文件夹 73 //mkdirs(): 创建多层目录,如:E:/upload/2019 74 //mkdir(): 只创建一层目录,如:E:upload 75 //如果不加这一行不会创建新的文件夹,会报系统找不到路径 76 newFile.getParentFile().mkdirs(); 77 } 78 //存储文件 79 multipartFile.transferTo(newFile); 80 //去掉目录名,保留文件总体路径,通过该路径访问图片 81 } 82 return ResponseResult.Success(ResultCodeEnums.SUCCESS); 83 } 84 }
文件过大异常捕获
1 /** 2 * @Author Qin 3 * @Date 2019-03-13 11:46 4 */ 5 @RestControllerAdvice 6 public class MyExceptionHandler { 7 8 @Autowired 9 private FilesConfig filesConfig; 10 11 /** 12 * 文件上传过大返回异常信息 13 * @param e 14 * @return 15 */ 16 @ExceptionHandler(MaxUploadSizeExceededException.class) 17 public JsonResult handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) { 18 String message = ResultCodeEnums.FAIL_10006.msg() 19 .replace("${size}",filesConfig.getMaxFileSize()) 20 .replace("${allsize}",filesConfig.getMaxRequestSize()); 21 ResultCodeEnums.FAIL_10006.setMsg(message); 22 return ResponseResult.Fail(ResultCodeEnums.FAIL_10006);//FAIL_10006("10006","单文件最大不可以超过${size},多文件最大不可以超过${allsize}"), 23 } 24 }