前言
文件的上傳和下載是項目開發(fā)中非常常見的功能检碗,例如圖片、郵件附件的上傳與下載球订,下載與上傳音頻后裸、視頻等。
1. 文件上傳
1.1 文件上傳介紹
文件上傳是通過表單的形式提交給服務(wù)器的冒滩,因此,實現(xiàn)文件的上傳浪谴,就需要一個提供上傳的表單开睡,而這個表單則必須滿足以下三個條件。
- form表單的method屬性為post
- form表單的enctype屬性為multipart/form-data
- 使用<input type="file" name="filename"/>為文件上傳輸入框
示例代碼如下:
<form action="${pageContext.request.contextPath}/fileUpload" method="post" enctype="multipart/form-data">
<input type="file" name="photo" multiple>
<input type="submit" value="上傳"/>
</form>
注意:使用 multiple 屬性苟耻,則可以同時選擇多個文件上傳篇恒。
enctype=multipart/form-data:該屬性表明發(fā)送的請求體的內(nèi)容是多表單元素的,通俗點講凶杖,就是有各種各樣的數(shù)據(jù)胁艰,可能有二進制數(shù)據(jù),也可能有表單數(shù)據(jù)智蝠。當使用該屬性時腾么,瀏覽器就會采用二進制流的方式來處理表單數(shù)據(jù),服務(wù)器端就會對文件上傳的請求進行解析處理杈湾。
1.2 文件上傳實現(xiàn)
1.2.1 添加依賴
Spring NVC 的文件上傳需要依賴Apache Commons FileUpload的組件解虱,即需要添加支持文件上傳的依賴。
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
1.2.2 配置上傳解析器
Spring MVC 為文件的上傳提供了直接的支持漆撞,而這個支持是通過MultipartResolver對象實現(xiàn)殴泰。MultipartResolver是一個接口,需要他的實現(xiàn)類CommonsMultipartResolver來完成文件上傳浮驳。而在Spring MVC中使用該對象悍汛,只需在配置文件中定義一個MultipartResolver接口的Bean即可。
<!-- 配置文件上傳解析器至会,將上傳的文件封裝為CommonsMultipartFile -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
</bean>
注意: 配置CommonsMultipartResolver時必須指定該bean的id為multipartResolver离咐。
MultipartResolver的屬性:
屬性名 作用
maxUploadSize 上傳文件的最大長度
maxInMemorySize 緩存中的最大尺寸
resolveLazily 推遲文件解析
defaultEncoding 默認編碼格式
1.2.3 通過表單上傳
<form action="${pageContext.request.contextPath}/fileUpload" method="post" enctype="multipart/form-data">
<input type="file" name="photo" multiple>
<input type="submit" value="上傳"/>
</form>
1.2.4 創(chuàng)建控制器類
@Controller
public class FileUploadController {
@RequestMapping("/fileUpload")
public String testFileUpload(MultipartFile photo, HttpSession session) throws IOException {
String filename = photo.getOriginalFilename();
ServletContext servletContext = session.getServletContext();
String realPath = servletContext.getRealPath("photo");
File file = new File(realPath);
//判斷realPath對應(yīng)的路徑是否存在
if (!file.exists()){
//不存在就創(chuàng)建
file.mkdir();
}
String finalPath = realPath + File.separator + filename;
photo.transferTo(new File(finalPath));
return "success";
}
}
-
文件上傳位置:
1.2.5 上傳演示
查看上傳結(jié)果,可以看到上傳成功了7芟住=∨旺上!
2. 文件下載
2.1文件下載的實現(xiàn)
文件下載就是將文件服務(wù)器中的文件下載到本地。
2.1.1 客服端創(chuàng)建超鏈接
需要先在文件下載目錄中添加一個a.jpg文件
<a href="${pageContext.request.contextPath}/fileDownload">下載a.jpg</a>
2.1.2 創(chuàng)建控制器類
使用Spring MVC提供的文件下載方法進行文件下載糖埋,Spring MVC為我們提供了一個ResponseEntity類型的對象來實現(xiàn)文件的下載宣吱。
@Controller
public class FileDownloadController {
@RequestMapping("/fileDownload")
public ResponseEntity<byte[]> testFileDownload(HttpSession session) throws IOException {
//獲取ServletContext對象
ServletContext servletContext = session.getServletContext();
//文件的真實路徑
String realPath = servletContext.getRealPath("static/img/a.jpg");
//創(chuàng)建輸入流
InputStream inputStream = new FileInputStream(realPath);
//創(chuàng)建字節(jié)數(shù)組
byte[] bytes = new byte[inputStream.available()];
//將流讀到字節(jié)數(shù)組中
inputStream.read(bytes);
//創(chuàng)建HttpHeaders對象,設(shè)置響應(yīng)頭信息
MultiValueMap<String,String> headers = new HttpHeaders();
//設(shè)置下載方式和下載文件的名稱 attachment表示以附件的形式下載
headers.add("Content-Disposition","attachment;filename=a.jpg");
//設(shè)置響應(yīng)狀態(tài)碼
HttpStatus status = HttpStatus.OK;
//創(chuàng)建ResponseEntity對象
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes,headers,status);
//關(guān)閉輸入流
inputStream.close();
return responseEntity;
}
}
2.1.3 下載演示
可以看到跟我們平時下載文件是一樣的瞳别。