SpringBoot文件上传和下载的实现源码

  

本篇文章介绍SpringBoot的上传和下载功能。

  

        编译(“org.springframework.boot: spring-boot-starter-web”)   编译(“org.springframework.boot: spring-boot-starter-thymeleaf”)      

工程目录为:

  

 SpringBoot文件上传和下载的实现源码

  

应用程序。java启动类

        包你好;   进口org.springframework.boot.SpringApplication;   进口org.springframework.boot.autoconfigure.SpringBootApplication;   进口org.springframework.boot.context.properties.EnableConfigurationProperties;   @SpringBootApplication   公共类应用程序{   公共静态void main (String [] args) {   SpringApplication.run (Application.class, args);   }   }      

  

在资源/模板目录下新建uploadForm.html

        & lt; html xmlns: th=" http://www.thymeleaf.org "比;   & lt; body>   & lt; div th:如果=" ${消息}"比;   & lt; h3 th:文本=" ${消息}"/比;   & lt;/div>   & lt; div>   method=" POST " enctype=& lt;形式“multipart/格式”行动="/"比;   & lt; table>   & lt; tr> & lt; td>文件上传:& lt;/td> & lt; td> & lt;输入type="文件" name="文件"/祝辞& lt;/td> & lt;/tr>   & lt; tr> & lt; td> & lt;/td> & lt; td> & lt;输入类型=疤峤弧眝alue=" https://www.yisu.com/zixun/Upload "/祝辞& lt;/td> & lt;/tr>   & lt;/table>   & lt;/form>   & lt;/div>   & lt; div>   & lt; ul>   & lt;李th:每个="文件:${文件}”在   & lt; th: href=" https://www.yisu.com/zixun/$ {file} " rel=巴獠縩ofollow”th:文本=" $ {file} "/比;   & lt;/li>   & lt;/ul>   & lt;/div>   & lt;/body>   & lt;/html>之前      

  

StorageService接口,
  

        包hello.storage;   进口org.springframework.core.io.Resource;   进口org.springframework.web.multipart.MultipartFile;   进口java.nio.file.Path;   进口java.util.stream.Stream;   公共接口StorageService {   无效的init ();   空白存储(MultipartFile文件);   Stream负荷();   路径负载(文件名字符串);   字符串资源loadAsResource(文件名);   空白deleteAll ();   }      

StorageService实现         包hello.storage;   进口org.springframework.core.io.Resource;   进口org.springframework.core.io.UrlResource;   进口org.springframework.stereotype.Service;   进口org.springframework.util.FileSystemUtils;   进口org.springframework.util.StringUtils;   进口org.springframework.web.multipart.MultipartFile;   进口java.io.IOException;   进口java.net.MalformedURLException;   进口java.nio.file.Files;   进口java.nio.file.Path;   进口java.nio.file.Paths;   进口java.nio.file.StandardCopyOption;   进口java.util.function.Predicate;   进口java.util.stream.Stream;   @ service   公共类FileSystemStorageService实现StorageService   {   私人最终路径rootLocation=Paths.get (“upload-dir”);/* *   *保存文件   *   * @param文件文件   */@Override   公共空间存储(MultipartFile文件)   {   字符串文件名=StringUtils.cleanPath (file.getOriginalFilename ());   试一试   {   如果(file.isEmpty ())   {   把新的StorageException(“失败的存储空文件”+文件名);   }   如果(filename.contains (“。”))   {//这是一个安全检查   把新的StorageException(“不能存储文件相对路径在当前目录”+文件名);   }   Files.copy (file.getInputStream (), this.rootLocation.resolve(文件名),StandardCopyOption.REPLACE_EXISTING);   }   抓住(IOException e)   {   把新StorageException(“没有存储文件”+文件名,e);   }   }/* *   *列出upload-dir下面所有文件   * @return   */@Override   公共Stream负荷()   {   试一试   {   返回Files.walk(这一点。rootLocation 1)//路径→! path.equals (this.rootLocation)   .filter(新的Predicate ()   {   @Override   公众的布尔测试路径(路径)   {   回报! path.equals (rootLocation);   }   });   }   抓住(IOException e)   {   把新的StorageException(“未能读取存储文件”,e);   }   }   @Override   公共道路负载(字符串文件名)   {   返回rootLocation.resolve(文件名);   }/* *   *获取文件资源   * @param文件名文件名   * @return资源   */@Override   公共资源loadAsResource(字符串文件名)   {   试一试   {   路径文件=负载(文件名);   资源资源=new UrlResource (file.toUri ());   如果(resource.exists () | | resource.isReadable ())   {   返回的资源;   }   其他的   {   把新的StorageFileNotFoundException(“不能读文件:”+文件名);   }   }   抓住(MalformedURLException e)   {   把新的StorageFileNotFoundException(“无法读取文件:“+文件名,e);   }   }/* *   *删除upload-dir目录所有文件   */@Override   公共空间deleteAll ()   {   FileSystemUtils.deleteRecursively (rootLocation.toFile ());   }/* *   *初始化   */@Override   公共空间init ()   {   试一试   {   Files.createDirectories (rootLocation);   }   抓住(IOException e)   {   把新StorageException(“不能初始化存储”,e);   }   }   }

SpringBoot文件上传和下载的实现源码