国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Java > 正文

SpringBoot 文件上傳和下載的實現(xiàn)源碼

2024-07-14 08:39:49
字體:
供稿:網(wǎng)友

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

一、創(chuàng)建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);   } } 

二、創(chuàng)建測試頁面

在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服務(wù)

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

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創(chuàng)建

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

listUploadedFiles函數(shù),會列出當(dāng)前目錄下的所有文件

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

總結(jié)

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


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 本溪市| 乐业县| 陆良县| 色达县| 麦盖提县| 阿拉尔市| 淮滨县| 英山县| 宜宾县| 黎城县| 吕梁市| 惠来县| 缙云县| 清水县| 平利县| 哈巴河县| 富宁县| 四子王旗| 温宿县| 故城县| 大洼县| 平顺县| 保亭| 阳泉市| 洛南县| 通海县| 呼图壁县| 永昌县| 含山县| 临颍县| 江阴市| 鄯善县| 剑阁县| 海宁市| 贡觉县| 长治县| 正定县| 原平市| 乌海市| 白水县| 望奎县|