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 }