你們好,我是阿濠,今篇內容跟你們分享的是我學習SSM框架所接觸到工程項目內的下載文件,很高興分享到segmentfault與你們一塊兒學習交流,初次見面請你們多多關照,一塊兒學習進步.
點擊下載1/2/3 提供文件下載
1.Spring、SpringMVC、Maven工程
2.項目WEB-INF裏文件下載
3.準備文件素材(圖片/PDF/xls文件/...)css
將準備好的素材等文件,放入工程的Webapp文件夾下,可在JSP界面裏直接A標籤寫入下載路徑,在JSP界面直接點擊訪問WEB-INF外files文件夾下的文件素材
可是須要注意的是靜態資源文件避免被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>
將素材放入WEB-INF裏進行保護,避免可直接訪問到,這時就不能夠經過JSP界面A標籤直接訪問下載路徑,須要經過Controller控制器路徑進行下載
控制器添加方法進行下載,須要經過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(); }
運行起來,發現還會出現這種問題
web
解決方法是添加配置文件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
將素材文件放入WEB-INF目錄下避免直接敲網址獲取文件,並經過一些自定義限制下載文件內容
segmentfault
//須要經過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(); }