文件上傳
多數文件上傳都是通過表單形式提交給後臺服務器的,因此,要實現文件上傳功能,就需要提供一個文件上傳的表單,而該表單必須滿足以下3個條件:
- form表單的method屬性設置爲post;
- form表單的enctype屬性設置爲
multipart/form-data
;(此時瀏覽器就會採用二進制流來處理表單數據,服務器端就會對文件上傳的請求進行解析處理。) - 提供
<input type="file" name="filename" />
的文件上傳輸入框。
Spring MVC通過MultipartResolver
實現文件上傳功能(不需要通過第三方組件來實現文件上傳)。MultipartResolver是一個接口對象,需要通過它的實現類CommonsMultipartResolver來完成文件上傳工作。
MultipartResolver配置示例如下:
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8" />//設置請求編碼格式,必須與JSP中的pageEncoding屬性一致,默認爲ISO-8859-1
<property name="maxUploadSize" value="2097152" />//設置允許上傳文件的最大值(2M),單位爲字節
...
</bean>
通過<property>
元素可以對文件解析器類CommonsMultipartResolver
的如下屬性進行配置:
- maxUploadSize:上傳文件
最大長度
(以字節爲單位); - maxInMemorySize:
緩存中的最大尺寸
; - defaultEncoding:默認編碼格式;
- resolveLazily:推遲文件解析,以便在Controller中捕獲文件大小異常。
注意
:因爲MultipartResolver接口的實現類CommonsMultipartResolver內部是引用multipartResolver字符串獲取該實現類對象並完成文件解析的,所以在配置CommonsMultipartResolver時必須指定該Bean的id爲multipartResolver
。
需要導入的jar包:
commons-fileupload-1.3.2.jar
commons-io-2.5.jar
org.springframework.web.multipart.MultipartFile接口
中提供了獲取上傳文件、文件名稱等方法,如下表所示:
文件下載
文件下載就是將文件服務器中的文件下載到本機上。在Spring MVC環境中,實現文件下載大致可分爲如下兩個步驟:
1.客戶端頁面使用一個文件下載的超鏈接
<a href="${pageContext.request.contextPath }/download?filename=1.jpg">
文件下載
</a>
2.在後臺使用Spring MVC提供的ResponseEntity
類型對象完成文件下載,使用它可以很方便的定義返回的結果對象
(HttpHeaders對象和HttpStatus對象),通過對這兩個對象的設置,即可完成下載文件時所需的配置信息。
- 響應頭信息中的MediaType代表的是Interner Media Type(即互聯網媒體類型),也叫做MIME類型,MediaType.APPLICATION_OCTET_STREAM的值爲application/octet-stream,即表示以二進制流的形式下載數據;
- HttpStatus類型代表的是Http協議中的狀態,示例中的HttpStatus.OK表示
200
,即服務器已成功處理了請求。
當對中文名稱的文件進行下載時,因爲各個瀏覽器內部轉碼機制
的不同,就會出現不同的亂碼以及解析異常問題。爲了解決瀏覽器中文件下載時中文名稱的亂碼問題,可以在前端頁面發送請求前先對中文名進行統一編碼,然後在後臺控制器類中對文件名稱進行相應的轉碼。
在下載頁面中對中文文件名編碼。可以使用Servlet API中URLEncoder.encoder(String s, String enc)方法將中文轉爲UTF-8編碼。