文章插圖

文章插圖
零、本篇要點介紹SpringBoot對文件上傳的自動配置 。介紹MultipartFile接口 。介紹SpringBoot+Thymeleaf文件上傳demo的整合 。介紹對文件類型,文件名長度等判斷方法 。一、SpringBoot對文件處理相關自動配置
自動配置是SpringBoot為我們提供的便利之一,開發者可以在不作任何配置的情況下,使用SpringBoot提供的默認設置,如處理文件需要的MultipartResolver 。
@Configuration(proxyBeanMethods = false)@ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class })@ConditionalOnProperty(prefix = "spring.servlet.multipart", name = "enabled", matchIfMissing = true)@ConditionalOnWebApplication(type = Type.SERVLET)@EnableConfigurationProperties(MultipartProperties.class)public class MultipartAutoConfiguration {private final MultipartProperties multipartProperties;public MultipartAutoConfiguration(MultipartProperties multipartProperties) {this.multipartProperties = multipartProperties;[email protected]@ConditionalOnMissingBean({ MultipartConfigElement.class, CommonsMultipartResolver.class })public MultipartConfigElement multipartConfigElement() {return this.multipartProperties.createMultipartConfig();[email protected](name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)@ConditionalOnMissingBean(MultipartResolver.class)public StandardServletMultipartResolver multipartResolver() {StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());return multipartResolver;}}Spring3.1之后支持StandardServletMultipartResolver,且默認使用StandardServletMultipartResolver,它的優點在于:使用Servlet所提供的功能支持,不需要依賴任何其他的項目 。想要自動配置生效,需要配置spring.servlet.multipart.enabled=true,當然這個配置默認就是true 。相關的配置設置在MultipartProperties中,其中字段就是對應的屬性設置,經典字段有:enabled:是否開啟文件上傳自動配置,默認開啟 。location:上傳文件的臨時目錄 。maxFileSize:最大文件大小,以字節為單位,默認為1M 。maxRequestSize:整個請求的最大容量,默認為10M 。fileSizeThreshold:文件大小達到該閾值,將寫入臨時目錄,默認為0,即所有文件都會直接寫入磁盤臨時文件中 。resolveLazily:是否惰性處理請求,默認為false 。我們也可以自定義處理的細節,需要實現MultipartResolver接口 。二、處理上傳文件MultipartFile接口SpringBoot為我們提供了MultipartFile強大接口,讓我們能夠獲取上傳文件的詳細信息,如原始文件名,內容類型等等,接口內容如下:
public interface MultipartFile extends InputStreamSource {String getName(); //獲取參數名@NullableString getOriginalFilename();//原始的文件名@NullableString getContentType();//內容類型boolean isEmpty();long getSize(); //大小byte[] getBytes() throws IOException;// 獲取字節數組InputStream getInputStream() throws IOException;//以流方式進行讀取default Resource getResource() {return new MultipartFileResource(this);}// 將上傳的文件寫入文件系統void transferTo(File var1) throws IOException, IllegalStateException;// 寫入指定pathdefault void transferTo(Path dest) throws IOException, IllegalStateException {FileCopyUtils.copy(this.getInputStream(), Files.newOutputStream(dest));}}三、SpringBoot+Thymeleaf整合demo1、編寫控制器/** * 文件上傳 * * @author Summerday [email protected] class FileUploadController {private static final String UPLOADED_FOLDER = System.getProperty("user.dir");@GetMapping("/")public String index() {return "file";}@PostMapping("/upload")public String singleFileUpload(@RequestParam("file") MultipartFile file,RedirectAttributes redirectAttributes) throws IOException {if (file.isEmpty()) {redirectAttributes.addFlashAttribute("msg", "文件為空,請選擇你的文件上傳");return "redirect:uploadStatus";}saveFile(file);redirectAttributes.addFlashAttribute("msg", "上傳文件" + file.getOriginalFilename() + "成功");redirectAttributes.addFlashAttribute("url", "/upload/" + file.getOriginalFilename());return "redirect:uploadStatus";}private void saveFile(MultipartFile file) throws IOException {Path path = Paths.get(UPLOADED_FOLDER + "/" + file.getOriginalFilename());file.transferTo(path);}@GetMapping("/uploadStatus")public String uploadStatus() {return "uploadStatus";}}2、編寫頁面file.html<html xmlns:th="http://www.thymeleaf.org"><!--suppress ALL--><html lang="en"><head><meta charset="UTF-8"><title>文件上傳界面</title></head><body><div><form method="POST" enctype="multipart/form-data" action="/upload"><table><tr><td><input type="file" name="file" /></td></tr><tr><td></td><td><input type="submit" value="http://www.mnbkw.com/jxjc/176309/上傳" /></td></tr></table></form></div></body></html>3、編寫頁面uploadStatus.html<!--suppress ALL--><html xmlns:th="http://www.thymeleaf.org"><html lang="en"><head><meta charset="UTF-8"><title>文件上傳界面</title></head><body><div th:if="${msg}"><h2 th:text="${msg}"/></div><div ><img src="" th:src="http://img.hubeilong.com/220623/0115526042-2.jpg" ></div></body></html>4、編寫配置server.port=8081spring.servlet.multipart.max-file-size=10MBspring.servlet.multipart.max-request-size=10MB5、配置虛擬路徑映射這一步是非常重要的,我們將文件上傳到服務器上時,我們需要將我們的請求路徑和服務器上的路徑進行對應,不然很有可能文件上傳成功,但訪問失敗:
【springmvc文件上傳大小限制 spring boot文件上傳大小限制】
@Configurationpublic class MvcConfig implements WebMvcConfigurer {private static final String UPLOADED_FOLDER = System.getProperty("user.dir");@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/upload/**").addResourceLocations("file:///" + UPLOADED_FOLDER + "/");}}對應關系需要自己去定義,如果訪問失敗,可以試著打印以下路徑,看看是否缺失了路徑分隔符 。注意:如果addResourceHandler不要寫成處理/**,這樣會攔截掉其他的請求6、測試頁面
執行mvn spring-boot:run,啟動程序,訪問http://localhost:8081/,選擇文件,點擊上傳按鈕,我們的項目目錄下出現了mongo.jpg,并且頁面也成功顯示:
/** * 文件上傳 * * @author Summerday [email protected] class FileUploadRestController {/*** 文件名長度*/private static final int DEFAULT_FILE_NAME_LENGTH = 100;/*** 允許的文件類型*/private static final String[] ALLOWED_EXTENSIONS = {"jpg", "img", "png", "gif"};/*** 項目路徑*/private static final String UPLOADED_FOLDER = System.getProperty("user.dir");@PostMapping("/restUpload")public Map<String,Object> singleFileUpload(@RequestParam("file") MultipartFile file) throws Exception {if (file.isEmpty()) {throw new Exception("文件為空!");}String filename = upload(file);String url = "/upload/" + filename;Map<String,Object> map = new HashMap<>(2);map.put("msg","上傳成功");map.put("url",url);return map;}/*** 上傳方法*/private String upload(MultipartFile file) throws Exception {int len = file.getOriginalFilename().length();if (len > DEFAULT_FILE_NAME_LENGTH) {throw new Exception("文件名超出限制!");}String extension = getExtension(file);if(!isValidExtension(extension)){throw new Exception("文件格式不正確");}// 自定義文件名String filename = getPathName(file);// 獲取file對象File desc = getFile(filename);// 寫入filefile.transferTo(desc);return filename;}/*** 獲取file對象*/private File getFile(String filename) throws IOException {File file = new File(UPLOADED_FOLDER + "/" + filename);if(!file.getParentFile().exists()){file.getParentFile().mkdirs();}if(!file.exists()){file.createNewFile();}return file;}/*** 驗證文件類型是否正確*/private boolean isValidExtension(String extension) {for (String allowedExtension : ALLOWED_EXTENSIONS) {if(extension.equalsIgnoreCase(allowedExtension)){return true;}}return false;}/*** 此處自定義文件名,uuid + extension*/private String getPathName(MultipartFile file) {String extension = getExtension(file);return UUID.randomUUID().toString() + "." + extension;}/*** 獲取擴展名*/private String getExtension(MultipartFile file) {String originalFilename = file.getOriginalFilename();return originalFilename.substring(originalFilename.lastIndexOf('.') + 1);}}
- class文件記事本打開全亂碼了 linux查看class文件內容亂碼
- 手機data文件怎么打開方式 data文件怎么打開
- 常見的視頻格式文件有哪些 視頻是什么格式的文件
- 電腦如何清理緩存垃圾 電腦如何清理緩存文件
- 迅雷鏈接文件格式 迅雷下載地址格式是什么
- 電腦文件夾加密碼怎么設置密碼 電腦文件夾加密碼怎么設置
- psd文件太大怎么縮小分辨率 psd文件太大怎么縮小 2020
- 手機怎么打開CAD文件 用手機怎么打開cad文件
- tar命令刪除壓縮包中文件 tar 壓縮后刪除文件
- 文件強行刪除工具 怎么能強制刪除文件夾
