亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

SpringBoot 文件上傳和下載的實現源碼

2024-07-13 10:17:39
字體:
來源:轉載
供稿:網友

本篇文章介紹SpringBoot的上傳和下載功能。

一、創建SpringBoot工程,添加依賴

compile("org.springframework.boot:spring-boot-starter-web") compile("org.springframework.boot:spring-boot-starter-thymeleaf") 

工程目錄為:

spring,boot,文件上傳,下載

Application.java 啟動類

package hello; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; @SpringBootApplication public class Application {   public static void main(String[] args) {     SpringApplication.run(Application.class, args);   } } 

二、創建測試頁面

在resources/templates目錄下新建uploadForm.html

<html xmlns:th="http://www.thymeleaf.org"> <body>   <div th:if="${message}">     <h2 th:text="${message}"/>   </div>   <div>     <form method="POST" enctype="multipart/form-data" action="/">       <table>         <tr><td>File to upload:</td><td><input type="file" name="file" /></td></tr>         <tr><td></td><td><input type="submit" value="Upload" /></td></tr>       </table>     </form>   </div>   <div>     <ul>       <li th:each="file : ${files}">         <a th:href="${file}" rel="external nofollow" th:text="${file}" />       </li>     </ul>   </div> </body> </html> 

三、新建StorageService服務

StorageService接口 

package hello.storage; import org.springframework.core.io.Resource; import org.springframework.web.multipart.MultipartFile; import java.nio.file.Path; import java.util.stream.Stream; public interface StorageService {   void init();   void store(MultipartFile file);   Stream<Path> loadAll();   Path load(String filename);   Resource loadAsResource(String filename);   void deleteAll(); } 

StorageService實現

package hello.storage; import org.springframework.core.io.Resource; import org.springframework.core.io.UrlResource; import org.springframework.stereotype.Service; import org.springframework.util.FileSystemUtils; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.net.MalformedURLException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.function.Predicate; import java.util.stream.Stream; @Service public class FileSystemStorageService implements StorageService {   private final Path rootLocation = Paths.get("upload-dir");   /**    * 保存文件    *    * @param file 文件    */   @Override   public void store(MultipartFile file)   {     String filename = StringUtils.cleanPath(file.getOriginalFilename());     try     {       if (file.isEmpty())       {         throw new StorageException("Failed to store empty file " + filename);       }       if (filename.contains(".."))       {         // This is a security check         throw new StorageException("Cannot store file with relative path outside current directory " + filename);       }       Files.copy(file.getInputStream(), this.rootLocation.resolve(filename), StandardCopyOption.REPLACE_EXISTING);     }     catch (IOException e)     {       throw new StorageException("Failed to store file " + filename, e);     }   }   /**    * 列出upload-dir下面所有文件    * @return    */   @Override   public Stream<Path> loadAll()   {     try     {       return Files.walk(this.rootLocation, 1) //path -> !path.equals(this.rootLocation)           .filter(new Predicate<Path>()           {             @Override             public boolean test(Path path)             {               return !path.equals(rootLocation);             }           });     }     catch (IOException e)     {       throw new StorageException("Failed to read stored files", e);     }   }   @Override   public Path load(String filename)   {     return rootLocation.resolve(filename);   }   /**    * 獲取文件資源    * @param filename 文件名    * @return Resource    */   @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);     }   }   /**    * 刪除upload-dir目錄所有文件    */   @Override   public void deleteAll()   {     FileSystemUtils.deleteRecursively(rootLocation.toFile());   }   /**    * 初始化    */   @Override   public void init()   {     try     {       Files.createDirectories(rootLocation);     }     catch (IOException e)     {       throw new StorageException("Could not initialize storage", e);     }   } } 

StorageException.java

package hello.storage; public class StorageException extends RuntimeException {   public StorageException(String message) {     super(message);   }   public StorageException(String message, Throwable cause) {     super(message, cause);   } } StorageFileNotFoundException.javapackage hello.storage; public class StorageFileNotFoundException extends StorageException {   public StorageFileNotFoundException(String message) {     super(message);   }   public StorageFileNotFoundException(String message, Throwable cause) {     super(message, cause);   } } 

四、Controller創建

將上傳的文件,放到工程的upload-dir目錄,默認在界面上列出可以下載的文件。

listUploadedFiles函數,會列出當前目錄下的所有文件

serveFile下載文件

handleFileUpload上傳文件

package hello;  import java.io.IOException; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.Resource; import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import hello.storage.StorageFileNotFoundException; import hello.storage.StorageService; @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();   } } 

源碼下載:https://github.com/HelloKittyNII/SpringBoot/tree/master/SpringBootUploadAndDownload

總結

以上所述是小編給大家介紹的SpringBoot 文件上傳和下載的實現源碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品久久久久| 成人黄色激情网| 成人伊人精品色xxxx视频| 久久男人的天堂| 亚洲国产欧美久久| 欧美专区日韩视频| 亚洲在线免费看| 亚洲精品720p| 亚洲美女av网站| 亚洲国产美女久久久久| 91久久精品日日躁夜夜躁国产| 粉嫩av一区二区三区免费野| 日韩欧美成人区| 欧美大片免费看| www.日韩av.com| 国产精品电影网站| 久久伊人精品视频| 精品国偷自产在线视频| 国产日韩精品综合网站| 欧美成人精品在线视频| 亚洲国产精品久久久| 97人人模人人爽人人喊中文字| 欧美黑人极品猛少妇色xxxxx| 国产精品嫩草影院一区二区| 成人两性免费视频| 久久人人爽人人| 国产精品成人一区二区三区吃奶| 欧美专区中文字幕| 日韩在线视频二区| 欧美性xxxxhd| 欧美国产日韩一区二区在线观看| 色吧影院999| 亚洲精品xxxx| 国产精品视频一区国模私拍| 亚洲第一在线视频| 亚洲高清不卡av| 久久成人精品一区二区三区| **欧美日韩vr在线| 亚洲第一综合天堂另类专| 国产成人精品久久二区二区91| 午夜剧场成人观在线视频免费观看| 菠萝蜜影院一区二区免费| 欧美日韩福利在线观看| 在线午夜精品自拍| 黄色一区二区在线| 午夜精品久久久久久久99黑人| 欧美一级大片视频| 国模吧一区二区三区| 亚洲成av人片在线观看香蕉| 国产精品久久久久久久久久尿| 国产97在线观看| 久久精品免费播放| 欧洲亚洲免费视频| 欧美日韩xxx| 啪一啪鲁一鲁2019在线视频| 欧美国产精品va在线观看| 国产精品福利在线观看| 欧美视频专区一二在线观看| 韩国19禁主播vip福利视频| 国产精品美女免费| 国产精品美女久久| 国产69久久精品成人| 亚洲一区二区三区视频播放| 国产精品羞羞答答| 欧美最猛性xxxxx(亚洲精品)| 亚洲va国产va天堂va久久| 欧美精品videos另类日本| 亚洲欧美综合区自拍另类| 久久人91精品久久久久久不卡| 欧美成人午夜激情视频| 国产精品18久久久久久麻辣| 国产精品白嫩美女在线观看| 亚洲午夜国产成人av电影男同| 中文字幕欧美专区| 亚洲男人天堂网站| www.亚洲天堂| 欧美精品久久久久久久免费观看| 中文字幕亚洲一区二区三区| 日韩人在线观看| 97色在线观看| 高清一区二区三区四区五区| 欧美电影第一页| 国产乱人伦真实精品视频| 性金发美女69hd大尺寸| 98精品国产高清在线xxxx天堂| 欧美性猛交xxxx富婆弯腰| 日本免费一区二区三区视频观看| 久久久噜噜噜久久中文字免| 96精品久久久久中文字幕| 中文字幕亚洲欧美日韩2019| 日韩中文有码在线视频| 欧美亚洲另类激情另类| 亚洲自拍偷拍第一页| 日韩大片在线观看视频| 亚洲福利在线播放| 欧美国产极速在线| 国产精品偷伦免费视频观看的| 亚洲自拍偷拍色图| 日韩精品视频在线免费观看| 91精品久久久久久久久久另类| 久久久国产一区二区三区| 在线播放亚洲激情| 久久777国产线看观看精品| 国产女精品视频网站免费| 91精品在线观| 欧美午夜性色大片在线观看| 日韩精品在线私人| 国产日韩精品综合网站| 中文字幕日本精品| 国产精品亚发布| 欧美日韩成人在线播放| 国外日韩电影在线观看| 亚洲欧洲在线视频| 久久天天躁狠狠躁老女人| 美乳少妇欧美精品| 91网在线免费观看| 亚洲国产精品久久久久久| 欧美性videos高清精品| 亚洲精品中文字| 一级做a爰片久久毛片美女图片| 亚洲iv一区二区三区| 欧美极品少妇xxxxⅹ裸体艺术| 欧美日韩人人澡狠狠躁视频| 美女黄色丝袜一区| 日韩黄在线观看| 国产精品入口免费视频一| 国产91精品久久久| 欧美第一黄网免费网站| 日韩欧美在线中文字幕| 国产亚洲激情在线| 久久九九热免费视频| 精品自拍视频在线观看| 国产欧美一区二区三区视频| 国产成人精品一区二区| 亚洲国产精彩中文乱码av| 国产一区二区视频在线观看| 欧美在线亚洲一区| 久久久久国产精品免费| 色综合男人天堂| 亚洲男子天堂网| 日韩精品免费看| 色综合久久中文字幕综合网小说| 日韩成人中文字幕| 国产精品激情av在线播放| 日韩欧美在线第一页| 久久成人免费视频| 亚洲奶大毛多的老太婆| 欧美猛男性生活免费| 国产69精品99久久久久久宅男| 欧美午夜影院在线视频| 国产精品日韩欧美大师| 亚洲aa中文字幕| 亚洲成人久久电影| 日韩高清有码在线| 中文字幕精品在线| 68精品国产免费久久久久久婷婷| 欧美极品美女视频网站在线观看免费| 亚洲国产成人精品一区二区| 久久久久久久一区二区三区| 日韩精品免费在线播放| 欧美性高潮在线| 国产成人精品优优av| 成人有码视频在线播放| 色婷婷综合久久久久|