1. 程式人生 > >SpringMVC檔案上傳和下載

SpringMVC檔案上傳和下載

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的輸出流中,最後注意重新整理輸出流,關閉流。