一、pom文件依赖的添加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
< dependencies >
< dependency >
< groupId >org.springframework.boot</ groupId >
< artifactId >spring-boot-starter-web</ artifactId >
</ dependency >
< dependency >
< groupId >org.springframework.boot</ groupId >
< artifactId >spring-boot-starter-test</ artifactId >
< scope >test</ scope >
</ dependency >
< dependency >
< groupId >org.springframework.boot</ groupId >
< artifactId >spring-boot-starter-thymeleaf</ artifactId >
</ dependency >
</ dependencies >
|
二、controller层
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
@Controller
public class FileUploadController {
private final StorageService storageService;
@Autowired
public FileUploadController(StorageService storageService) {
this .storageService = storageService;
}
//展示上传过的文件
@GetMapping ( "/" )
public String listUploadedFiles(Model model) throws IOException {
model.addAttribute( "files" , storageService.loadAll().map(path ->
MvcUriComponentsBuilder.fromMethodName(FileUploadController. class , "serveFile" , path.getFileName().toString())
.build().toString())
.collect(Collectors.toList()));
return "uploadForm" ;
}
//下载选定的上传的文件
@GetMapping ( "/files/{filename:.+}" )
@ResponseBody
public ResponseEntity<Resource> serveFile( @PathVariable String filename) {
Resource file = storageService.loadAsResource(filename);
return ResponseEntity
.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" +file.getFilename()+ "\"" )
.body(file);
}
//上传文件
@PostMapping ( "/" )
public String handleFileUpload( @RequestParam ( "file" ) MultipartFile file,
RedirectAttributes redirectAttributes) {
storageService.store(file);
redirectAttributes.addFlashAttribute( "message" ,
"You successfully uploaded " + file.getOriginalFilename() + "!" );
return "redirect:/" ;
}
@ExceptionHandler (StorageFileNotFoundException. class )
public ResponseEntity<?> handleStorageFileNotFound(StorageFileNotFoundException exc) {
return ResponseEntity.notFound().build();
}
}
|
三、实现的service层
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
@Service
public class FileSystemStorageService implements StorageService {
private final Path rootLocation;
@Autowired
public FileSystemStorageService(StorageProperties properties) {
this .rootLocation = Paths.get(properties.getLocation());
}
@Override
public void store(MultipartFile file) {
try {
if (file.isEmpty()) {
throw new StorageException( "Failed to store empty file " + file.getOriginalFilename());
}
Files.copy(file.getInputStream(), this .rootLocation.resolve(file.getOriginalFilename()));
} catch (IOException e) {
throw new StorageException( "Failed to store file " + file.getOriginalFilename(), e);
}
}
@Override
public Stream<Path> loadAll() {
try {
return Files.walk( this .rootLocation, 1 )
.filter(path -> !path.equals( this .rootLocation))
.map(path -> this .rootLocation.relativize(path));
} catch (IOException e) {
throw new StorageException( "Failed to read stored files" , e);
}
}
@Override
public Path load(String filename) {
return rootLocation.resolve(filename);
}
@Override
public Resource loadAsResource(String filename) {
try {
Path file = load(filename);
Resource resource = new UrlResource(file.toUri());
if (resource.exists() || resource.isReadable()) {
return resource;
}
else {
throw new StorageFileNotFoundException( "Could not read file: " + filename);
}
} catch (MalformedURLException e) {
throw new StorageFileNotFoundException( "Could not read file: " + filename, e);
}
}
@Override
public void deleteAll() {
FileSystemUtils.deleteRecursively(rootLocation.toFile());
}
@Override
public void init() {
try {
Files.createDirectory(rootLocation);
} catch (IOException e) {
throw new StorageException( "Could not initialize storage" , e);
}
}
}
|
四、在application.properties文件上配置上传的属性
spring.http.multipart.max-file-size=128KB
spring.http.multipart.max-request-size=128KB
五、服务启动时的处理
六、测试成功的结果
以上这篇基于SpringBoot上传任意文件功能的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。