本篇文章介绍SpringBoot的上传和下载功能。
编译(“org.springframework.boot: spring-boot-starter-web”) 编译(“org.springframework.boot: spring-boot-starter-thymeleaf”)
工程目录为:
应用程序。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文件上传和下载的实现源码