最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于SpringBoot上傳任意文件功能的實現(xiàn)

 更新時間:2017年08月01日 20:17:21   投稿:jingxian  
下面小編就為大家?guī)硪黄赟pringBoot上傳任意文件功能的實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、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();
  }
}

三、實現(xiàn)的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

五、服務啟動時的處理

六、測試成功的結(jié)果

以上這篇基于SpringBoot上傳任意文件功能的實現(xiàn)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java?Stream實現(xiàn)多字段分組groupingBy操作詳解

    Java?Stream實現(xiàn)多字段分組groupingBy操作詳解

    Stream是Java8的一個新特性,主要用戶集合數(shù)據(jù)的處理,如排序、過濾、去重等等功能,本文就來講講如何利用Stream實現(xiàn)比較優(yōu)雅的按多字段進行分組groupingBy吧
    2023-06-06
  • MyEclipse安裝JS代碼提示的教程(Spket插件)

    MyEclipse安裝JS代碼提示的教程(Spket插件)

    本篇文章主要介紹了MyEclipse安裝JS代碼提示的教程(Spket插件),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Java拼接字符串時如何去掉最后一個多余的逗號

    Java拼接字符串時如何去掉最后一個多余的逗號

    當我們遍歷拼接字符串的時候,最后會多出一個我們添加的字符(比如逗號),下面通過實例代碼給大家介紹Java拼接字符串時去掉最后一個多余的逗號,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • 基于Spring?Boot的線程池監(jiān)控問題及解決方案

    基于Spring?Boot的線程池監(jiān)控問題及解決方案

    這篇文章主要介紹了基于Spring?Boot的線程池監(jiān)控方案,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • 詳解Servlet3.0新特性(從注解配置到websocket編程)

    詳解Servlet3.0新特性(從注解配置到websocket編程)

    Servlet3.0的出現(xiàn)是servlet史上最大的變革,其中的許多新特性大大的簡化了web應用的開發(fā),為廣大勞苦的程序員減輕了壓力,提高了web開發(fā)的效率。
    2017-04-04
  • Java中的collection集合類型總結(jié)

    Java中的collection集合類型總結(jié)

    Java的集合類型都是對java.util包中Collection接口的繼承,這里我們主要介紹依賴于collection的一些主分支,一起來看一下Java中的collection集合類型總結(jié)
    2016-05-05
  • Java黑科技:replace首個替換一秒搞定

    Java黑科技:replace首個替換一秒搞定

    要實現(xiàn)只替換第一個匹配項,可以使用Java中的String類的replaceFirst方法,該方法接受兩個參數(shù),第一個參數(shù)是要替換的字符串或正則表達式,第二個參數(shù)是替換后的字符串,需要的朋友可以參考下
    2023-10-10
  • Java 正則表達式功能及應用

    Java 正則表達式功能及應用

    自從jdk1.4推出java.util.regex包,就為我們提供了很好的Java正則表達式應用平臺,因為Java正則表達式是一個很龐雜的體系。
    2010-03-03
  • idea插件生成jpa實體類的實現(xiàn)示例

    idea插件生成jpa實體類的實現(xiàn)示例

    本文主要介紹了idea插件生成jpa實體類的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-01-01
  • 詳解JDK 5 Annotation 注解之@Target的用法介紹

    詳解JDK 5 Annotation 注解之@Target的用法介紹

    這篇文章主要介紹了詳解JDK 5 Annotation 注解之@Target的用法介紹,需要的朋友可以參考下
    2016-02-02

最新評論

永清县| 洛阳市| 格尔木市| 健康| 永兴县| 芷江| 郑州市| 宜春市| 饶河县| 玛多县| 莒南县| 衢州市| 平陆县| 莱西市| 新乐市| 鸡西市| 涡阳县| 高要市| 乐亭县| 利辛县| 任丘市| 慈溪市| 大同市| 英吉沙县| 邯郸县| 门头沟区| 闵行区| 儋州市| 虎林市| 田东县| 盐边县| 葫芦岛市| 思茅市| 肥东县| 于田县| 普兰县| 家居| 安新县| 宁津县| 留坝县| 新龙县|