SSM框架進步記錄:在工程裏下載文件

做者前言

你們好,我是阿濠,今篇內容跟你們分享的是我學習SSM框架所接觸到工程項目內的下載文件,很高興分享到segmentfault與你們一塊兒學習交流,初次見面請你們多多關照,一塊兒學習進步.

點擊下載1/2/3 提供文件下載

clipboard.png

學習項目準備


1.Spring、SpringMVC、Maven工程
2.項目WEB-INF裏文件下載
3.準備文件素材(圖片/PDF/xls文件/...)css

方案以下:

1.公共文件隨意訪問

clipboard.png

將準備好的素材等文件,放入工程的Webapp文件夾下,可在JSP界面裏直接A標籤寫入下載路徑,在JSP界面直接點擊訪問WEB-INF外files文件夾下的文件素材
clipboard.png
可是須要注意的是靜態資源文件避免被SpringMvc看成跳轉路徑,因此在工程web.xml文件裏添加靜態資源過濾html

<servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
        <url-pattern>*.css</url-pattern>
        <url-pattern>*.html</url-pattern>
        <url-pattern>*.htm</url-pattern>
        <url-pattern>/imgs/*</url-pattern>
        //該路徑下files進行過濾
        <url-pattern>/files/*</url-pattern>
</servlet-mapping>

2.放入WEB-INF保護

將素材放入WEB-INF裏進行保護,避免可直接訪問到,這時就不能夠經過JSP界面A標籤直接訪問下載路徑,須要經過Controller控制器路徑進行下載
clipboard.png
控制器添加方法進行下載,須要經過HttpServletResponse完成下載java

//須要經過HttpServletResponse完成下載由於Response表明輸出流m
@RequestMapping ("/down")
public void download(String name, HttpServletResponse resp) throws IOException {

    //獲取files文件夾絕對路徑
    string dir="H:\\mydwon\\src\\main\\webapp\\files;
    String filePath=dir+"\\"+name;
    //讀入文件 InputStream讀入文件渠道
    InputStream in=new FileInputStreamfilepath);
    //輸出文件 OutputStream輸出渠道最合適使用outputStream二進制輸出下載
    OutputStream os=resp.getOutputStream();
    //具體運行 文件輸出,一邊讀,一邊出
    FileUtil.copyStream(in,os);
    //完成下載 把讀進來的東西傳出去完成文件的輸出
    in.close();
    os fush();
}

運行起來,發現還會出現這種問題
clipboard.pngweb

解決方法是添加配置文件json

//對輸出流文字進行編碼utf-8
resp.setCharacterEncoding("utf-8");
//告訴瀏覽器須要彈出保存框 text/html application/json
resp.setContentType("app1ication/x-msdownload");
//彈框時文件名是什麼,由下面這段話決定(中文文件名)
//resp.setHeader("Content-Type","application/x-msdownload;charset=utf-8");
//Content-Disposttion是頭信息
resp.setHeader("Content-Disposition","attachment;filename*=UTF-8'" + URLEncoder.encode(name , "UTF-8"));
//name=彈框名稱 URLEncoder導包java.net

clipboard.png

3.自定義限制下載

clipboard.png

將素材文件放入WEB-INF目錄下避免直接敲網址獲取文件,並經過一些自定義限制下載文件內容
clipboard.pngsegmentfault

//須要經過HttpServletResponse完成下載由於Response表明輸出流m
@RequestMapping ("/down")
public void download(String name, HttpServletResponse resp) throws IOException {
    
    //if(是否已經登陸)
    //跳轉到登陸頁
    
    //if(用戶積分夠不夠)
    //跳轉到充值頁面

    //動態獲取工程目錄
    String dir=req.getServletContext().getRealPath("/WEB-INF/files")
    //獲取文件路徑
    String filepath=dir+"\\"+name;
    
    //對輸出流文字進行編碼utf-8
    resp.setCharacterEncoding("utf-8");
    //告訴瀏覽器須要彈出保存框 text/html application/json
    resp.setContentType("app1ication/x-msdownload");
    //頭信息
    resp.setHeader("Content-Disposition","attachment;filename*=UTF-8'" + URLEncoder.encode(name,"UTF-8"));
  
    //讀入文件 InputStream讀入文件渠道
    InputStream in=new FileInputStreamfilepath);
    //輸出文件 OutputStream輸出渠道最合適使用outputStream二進制輸出下載
    OutputStream os=resp.getOutputStream();
    //具體運行 文件輸出,一邊讀,一邊出
    FileUtil.copyStream(in,os);
    //完成下載 把讀進來的東西傳出去完成文件的輸出
    in.close();
    os fush();
}
相關文章
相關標籤/搜索