Springmvc 下載文件

前言

有時候項目裏需要下載文件的功能,但是一時之間不知道從何下手,故此記錄。

一、使用HttpServletResponse

最簡單方便的便是使用HttpServletResponse,設置一下請求頭,獲取到輸出流。

	public static void download(HttpServletRequest request, HttpServletResponse response)throws Exception {
	   
		String fileName = "要下載的文件的名字";
		String filePath = "要下載的文件在服務器的存儲地址";
		
	    //設置響應頭和客戶端保存文件名
	    response.setCharacterEncoding("utf-8");
	    response.setContentType("multipart/form-data");
	    response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
	    
	    //打開本地文件流
        InputStream in = new FileInputStream(filePath);
        //激活下載操作
        OutputStream os = response.getOutputStream();
	    try {
	        //循環寫入輸出流
	        byte[] b = new byte[2048];
	        int length;
	        while ((length = in.read(b)) > 0) {
	            os.write(b, 0, length);
	        }

	    } catch (Exception e){
	        throw e;
	    } finally {
	    	os.close();
	        in.close();
		}
	    
	}

二、使用ResponseEntity

使用方法基本一樣,就是稍微簡介了一些,也可以下載byte數組。

    public ResponseEntity<Object> download(HttpServletRequest request)throws Exception{
        
        byte[] data = "獲取到的byte數組,也可以是輸入流讀取來的";
        String fileName = "文件名字";
        
        //設置響應頭
        HttpHeaders headers = new HttpHeaders();
        headers.setCacheControl("no-cache, no-store, must-revalidate");
        //防止中文亂碼
        headers.setContentDispositionFormData("attachment",new String(fileName.getBytes("UTF-8"), "iso-8859-1"));
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        //headers.setContentLength(file.getContentLength());
        headers.setPragma("no-cache");
        
        return new ResponseEntity<Object>(data, headers, HttpStatus.CREATED);
    }

寫在最後的話

這兩種下載方式各有優缺點吧,ResponseEntity比較簡潔一些,但是是一種一次性讀取的下載方式,下載太大文件會導致內存溢出。使用response對下載的文件大小無限制(循環讀取一定量的字節寫入到輸出流中,因此不會造成內存溢出,但是在下載人數過多的時候應該還是出現一些異常)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章