文件下載就是將文件服務器中的文件下載到本地,在springmvc中要實現文件下載可分為兩個步驟:
第一步:在客戶端使用一個文件下載超鏈接,鏈接里面的href屬性指向后台下載文件的方法以及文件名;
第二步:在后台controller類中,使用springmvc提供的文件下載方法進行下載。
springmvc提供了一個ResponseEntity類型的對象,使用它可以很方便的定義返回的HttpHeaders對象和HttpStatus對象,通過對這兩個對象的設置,即可完成下載文件時所需的配置信息。文件下載的代碼如下所示:
public ResponseEntity<byte[]> downFile(HttpServletRequest request, String filename) throws IOException {
//指定要下載的文件所在路徑
String path = request.getServletContext().getRealPath("/upload/");
//創建該文件對象
File file = new File(path + File.separator + filename);
//設置響應頭
HttpHeaders headers = new HttpHeaders();
//通知瀏覽器以下載的方式打開文件
headers.setContentDispositionFormData("attachment", filename);
//定義以流的形式下載返回文件數據
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//使用springmvc框架的ResponseEntity對象封裝返回數據
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
}
說明:在downFile方法中,首先根據文件路徑和需要下載的文件名來創建文件對象,然后對響應頭中文件下載時的打開方式以及下載方式進行了設置,最后返回ResponseEntity封裝的下載結果對象。MediaType.APPLICATION_OCTET_STREAM
表示以二進制流的形式下載數據。
對於中文名稱的文件名亂碼處理:
如果文件名是英文的則不會出現文件名亂碼的情況,但是如果文件名中有中文,則可能出現亂碼,這個時候需要對文件名進行轉碼處理。如下所示:
public ResponseEntity<byte[]> downFile(HttpServletRequest request, String filename) throws IOException {
//指定要下載的文件所在路徑
String path = request.getServletContext().getRealPath("/upload/");
//創建該文件對象
File file = new File(path + File.separator + filename);
//對文件名進行編碼,防止中文文件名亂碼
filename = this.getFilename(request, filename);
//設置響應頭
HttpHeaders headers = new HttpHeaders();
//通知瀏覽器以下載的方式打開文件
headers.setContentDispositionFormData("attachment", filename);
//定義以流的形式下載返回文件數據
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//使用springmvc框架的ResponseEntity對象封裝返回數據
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
}
/**
* 根據瀏覽器的不同進行編碼設置
*
* @param request 請求對象
* @param filename 需要轉碼的文件名
* @return 返回編碼后的文件名
* @throws IOException
*/
public String getFilename(HttpServletRequest request, String filename) throws IOException {
//IE不同版本User-Agent中出現的關鍵詞
String[] IEBrowserKeyWords = {"MSIE", "Trident", "Edge"};
//獲取請求頭代理信息
String userAgent = request.getHeader("User-Agent");
for (String keyWord : IEBrowserKeyWords) {
if (userAgent.contains(keyWord)) {
//IE內核瀏覽器,統一為utf-8編碼顯示
return URLEncoder.encode(filename, "UTF-8");
}
}
//火狐等其他瀏覽器統一為ISO-8859-1編碼顯示
return new String(filename.getBytes("UTF-8"), "ISO-8859-1");
}
以上就是springmvc的文件下載內容。