基于SpringBoot上传任意文件功能的实现

一、pom文件依赖的添加

<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层

@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层

@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上传任意文件功能的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

以上是 基于SpringBoot上传任意文件功能的实现 的全部内容, 来源链接: utcz.com/p/213670.html

回到顶部