首页 > 编程 > Java > 正文

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

2019-11-26 11:45:25
字体:
来源:转载
供稿:网友

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

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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表