第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

Spring MVC 文件上傳

1. 前言

實(shí)現(xiàn)文件上傳有很多方案。如使用原始的 IO 流或者使用第三方上傳插件。

Spring MVC 自帶有文件上傳組件,能很容易地實(shí)現(xiàn)文件上傳功能。

本節(jié)課程將和大家一起講解 Spring MVC 是如何處理文件上傳的。通過(guò)本章節(jié)內(nèi)容的學(xué)習(xí),你將掌握使用 MultipartResolver 相關(guān)組件簡(jiǎn)單的實(shí)現(xiàn)文件上傳。

2. MultipartResolver 組件

多數(shù)情況下,頁(yè)面中的數(shù)據(jù)都是以字符串格式發(fā)送給服務(wù)器。但有時(shí),用戶(hù)需要上傳自己的個(gè)人頭像或者上傳文件,或者說(shuō)以二進(jìn)制的方式進(jìn)行數(shù)據(jù)傳送。這時(shí)就不能使用字符串的方式傳遞數(shù)據(jù)了。

Spring MVC 提供有 MultipartResolver 相關(guān)組件實(shí)現(xiàn)文件上傳,不需要特別引入第三方模塊。默認(rèn)情況下,Spring MVC 沒(méi)有啟用文件上傳組件,使用前需要做些簡(jiǎn)單的配置。

2.1 配置文件上傳組件

打開(kāi)項(xiàng)目中的 WebConfig 文件,添加如下代碼:

@Bean
public MultipartResolver multipartResolver() {
	return new StandardServletMultipartResolver();
}

MultipartResolver 是一個(gè)接口,約定了文件上傳的方法。StandardServletMultipartResolver 是具體的實(shí)現(xiàn)類(lèi),用來(lái)完成文件上傳。

對(duì)上傳的文件信息進(jìn)一步進(jìn)行配置,如限制文件大小、文件類(lèi)型等。打開(kāi) WebInitializer 文件,重寫(xiě) customizeRegistration() 方法:

@Override
protected void customizeRegistration(Dynamic registration) {
	 registration.setMultipartConfig(new MultipartConfigElement(null,2000000,400000,0));
}

MultipartConfigElement()方法可以接收 3 個(gè)參數(shù):

  • 第一個(gè)參數(shù)指定保存上傳文件的臨時(shí)目錄。如果指定 null,由 Spring MVC 自己提供;最好不要指定;
  • 第二個(gè)參數(shù),文件上傳的最小大小限制;
  • 第三個(gè)參數(shù),文件上傳的最大尺寸限制。

圖片描述

2.2 實(shí)現(xiàn)流程

準(zhǔn)備工作完成,現(xiàn)在實(shí)現(xiàn)文件上傳。

  1. 編寫(xiě)提交表單;
<form action="upload" method="POST" enctype="multipart/form-data">
   	選擇文件:<input type="file" name="file" value="" /> <br /> 
   	<input type="submit" name="upload" value="上傳" />
</form>

表單的 enctype 屬性有如下幾個(gè)選擇:

  • application/x-www-form-urlencoded : 在發(fā)送前編碼所有字符,數(shù)據(jù)以字符串的方式發(fā)送;
  • multipart/form-data: 不對(duì)字符編碼,使用包含文件上傳控件的表單時(shí),必須使用該值;
  • text/plain: 空格轉(zhuǎn)換為 “+” 加號(hào),但不對(duì)特殊字符編碼。

Tips: 因?yàn)楸韱沃邪形募蟼骺丶?,所以,一定要設(shè)置表單的 enctype 值為 multipart/form-data。

  1. 獲取項(xiàng)目上下文絕對(duì)路徑;

編寫(xiě)控制器之前,先打開(kāi) web.xml ,注冊(cè)一個(gè) org.springframework.web.util.WebAppRootListener 監(jiān)聽(tīng)器,通過(guò)此監(jiān)聽(tīng)器獲取到 Spring MVC 項(xiàng)目的發(fā)布的絕對(duì)路徑,用來(lái)為上傳的文件指定存儲(chǔ)位置。

<context-param>
	<param-name>webAppRootKey</param-name>
	<param-value>webapp.root</param-value>
</context-param>
<listener>
	<listener-class>org.springframework.web.util.WebAppRootListener</listener-class>
</listener>

Tips: webapp.root 相當(dāng)于一個(gè)變量,可以是符合規(guī)范的任意命稱(chēng)。當(dāng)程序啟動(dòng)時(shí),此監(jiān)聽(tīng)器會(huì)把服務(wù)器絕對(duì)路徑保存在此變量中。使用監(jiān)聽(tīng)器的方式獲取路徑可以有效地減少開(kāi)發(fā)者的編碼量。

當(dāng)然,完全可以不使用此監(jiān)聽(tīng)器,開(kāi)發(fā)者可以在控制器中通過(guò)注入原生 Servlet API 編碼獲取。

  1. 編寫(xiě)控制器:
@Controller
public class UpLoadAction {
	@RequestMapping("/upload")
   	public String upload(@RequestPart("upFile") byte[] file) throws IOException {
   		String path = System.getProperty("webapp.root");
   		String filePath = path + "\\upload\\temp.png";
   		FileOutputStream fileOutputStream = new FileOutputStream(filePath);
   		FileCopyUtils.copy(file, fileOutputStream);
   		return "success";
   	}
}

解釋上面的代碼:

  • System.getProperty(“webapp.root”) 可以得到監(jiān)聽(tīng)器組件得到的項(xiàng)目上下文路徑。在項(xiàng)目的根目錄下新建 upload 目錄,用來(lái)存儲(chǔ)上傳過(guò)來(lái)的文件;
  • @RequestPart(“upFile”) 注解能注入表單提交上來(lái)的文件數(shù)據(jù),此數(shù)據(jù)以 byte[] 類(lèi)型保存。

使用 @RequestPart(“upFile”) 注解的方式存在些問(wèn)題,不能獲取上傳文件的文件名等其它元數(shù)據(jù)信息。

  1. 實(shí)例測(cè)試。

打開(kāi)瀏覽器,顯示上傳頁(yè)面。

圖片描述
在本地首先選擇好需要上傳的文件,然后點(diǎn)擊上傳。找到 tomcat 中的項(xiàng)目發(fā)布目錄,可以找到剛上傳的文件。
圖片描述

2.3 MultipartFile 接口

以字節(jié)數(shù)組的方式接收上傳的文件數(shù)據(jù),過(guò)于原始、低級(jí),很難獲取到文件的元數(shù)據(jù)。Spring MVC 提供有 MultipartFile 接口。

查看 MultipartFile 接口源代碼,可以知道 MultipartFile 接口提供了很多方法,能解析出上傳文件的更多元數(shù)據(jù),包括文件名、文件大小等,方便開(kāi)發(fā)者更靈活地處理數(shù)據(jù)。

public interface MultipartFile extends InputStreamSource {
   String getName();
   @Nullable
   String getOriginalFilename();
   @Nullable
   String getContentType();
   boolean isEmpty();
   long getSize();
   byte[] getBytes() throws IOException;
   @Override
   InputStream getInputStream() throws IOException;
   default Resource getResource() {
   	return new MultipartFileResource(this);
   }
   void transferTo(File dest) throws IOException, IllegalStateException;
   	default void transferTo(Path dest) throws IOException, IllegalStateException {
   		FileCopyUtils.copy(getInputStream(), Files.newOutputStream(dest));
   	}
}

MultipartFile 最常用的是 transferTo 方法,用來(lái)把上傳文件存儲(chǔ)到指定位置。

重構(gòu)上面的控制器代碼。

   @RequestMapping("/upload")
   public String upload(@RequestPart("upFile") MultipartFile file) throws IOException {
   	String path = System.getProperty("webapp.root");
   	String filePath = path + "\\upload\\"+file.getOriginalFilename();
   	System.out.println(filePath);
       file.transferTo(new File(filePath));
   	return "success";
   }

如上面一樣測(cè)試文件上傳,結(jié)果沒(méi)有什么不一樣。

3. 小結(jié)

本節(jié)和大家講解了如何使用 Spring MVC 提供的 MultipartResolver 組件完成文件的上傳。其配置過(guò)程并不很難,但大家需要注意的是,在接收文件數(shù)據(jù)時(shí)會(huì)涉及到 @RequestPart 注解、MultipartFile 接口,結(jié)合兩者能很好的注放上傳數(shù)據(jù),方便開(kāi)發(fā)者的后續(xù)處理。