SpringMVC檔案上傳和下載
阿新 • • 發佈:2018-11-11
1. 檔案上傳
SpringMVC通過MultipartResolver來實現檔案上傳,預設沒有裝配,使用MultipartResolver需要加上commons-fileupload這個jar包。
1.1 配置MultipartResolver
<!--配置上傳檔案控制元件-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
p:defaultEncoding="UTF-8"//檔案編碼
p:maxUploadSize ="5242880"//檔案最大上傳大小
p:uploadTempDir="file:/home/rookie/temp"/>//臨時儲存路徑
1.2 編寫Controller方法
@RequestMapping("/upload")
public @ResponseBody String upload(@RequestParam("file") MultipartFile file) throws IOException{
if(!file.isEmpty()){
file.transferTo(new File(this.getClass().getClassLoader().getResource("/" ).getPath()+file.getOriginalFilename()));//將檔案從預設目錄拷貝
return "success";
}else{
return "redirect:/welcome.jsp";
}
}
1.3 HTML頁面編寫
<form action="upload" enctype="multipart/form-data" method="post">//enctype和method必須
<input type="file" name="file"/> <br/>
<input type="submit" value="upload"/><br/>
</form>
2. 檔案下載
將檔案傳送資源傳送到瀏覽器,需要完成以下幾步:
對請求處理方法使用void返回型別,並在方法中新增HttpServletResponse引數。
將響應的內容型別設為檔案的內容型別。Content-Type標題在某個實體的body中定義資料型別,幷包含媒體型別和子型別識別符號。如果不清楚內容型別,並且希望瀏覽器始終顯示另存為對話方塊,則將他設為application/ectet-stream。
新增一個名為Content-Dispostion的Http響應標題,並賦值attachment;filename=fileName.
(1). 隱藏資源:可以將檔案放在WEB-INF目錄下,這樣只有授權的使用者才可以訪問
(2).防止交叉引用:獲取請求的referer屬性,如果該屬性值為空或者非預期值,則不將檔案返回給瀏覽器。
Controller編寫
@RequestMapping("/download")
public void download(@RequestHeader(value = "referer",defaultValue = "")String referer, HttpServletResponse response) throws IOException{
if("".equals(referer)) {//判斷是否為盜鏈,瀏覽器直接輸入地址無法下載
response.getWriter().write("Invalid Request");
return;
}
response.setContentType("application/javascript");
response.setCharacterEncoding("utf-8");
System.out.println(referer);
response.setHeader("Content-Disposition","attachment;filename=jquery.js");
FileInputStream inputStream=new FileInputStream(this.getClass().getClassLoader().getResource("../../js/jquery-3.2.1.min.js").getPath());//檔案為web根目錄/js/jquery-3.2.1.min.js
OutputStream outputStream=response.getOutputStream();
byte []bytes=new byte[1024];
while(inputStream.read(bytes)!=-1){
outputStream.write(bytes);
}
outputStream.flush();
outputStream.close();
inputStream.close();
}
總結:使用檔案上傳的步驟:配置依賴項(commons-fileupload),配置MultipartResolver,在Html頁面的表單中注意新增method和enctype屬性。檔案下載步驟:設定檔案頭(Content-Disposition)、MIME型別和編碼方式,將輸入流寫到HttpServletResponse的輸出流中,最後注意重新整理輸出流,關閉流。