1. 程式人生 > >從tomcat下載檔案

從tomcat下載檔案

其實最開始的需求,就是希望使用tomcat下載伺服器上的一些檔案
當然如果檔案就放在{tomcat_home}/webapp/myproject/下那一切都好辦
但是把自己放在這裡,每次eclipse那邊一啟動,東西就沒了不合適


方案一

從網上查到的資料,是這樣的
1、在tomcat 安裝目錄\conf\Catalina\localhost下建立任意檔名xml檔案,比如:download_file.xml,
內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context  reloadable="true" docBase="D://myfiles" crossContext="true">
</Context>
然後
2、配置web.xml(tomcat的配置檔案),修改如下配置:
     <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
要將listings的false改為true。
然後重啟tomcat,訪問localhost:8080/download_file
記住訪問的工程名就是剛才新建的那個xml檔案的名字
就能看的如下圖的介面:

這樣直接在圖上點選檔名,或者對著瀏覽器輸入檔案的地址就能看到檔案內容連線另存為就能下載如果檔名包含中文,就在

{tomcat_home}/conf/server.xml中加上URIEncoding="UTF-8,如下:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
上面的效果其實還不錯,但是也有問題
如果我不想讓使用者看所有的問題,只想讓使用者看某些檔案,怎麼辦



方案二

設定Tomcat的虛擬目錄
{tomcat_home}/conf/serer.xml中的server/service/engine/host下
增加
<Context docBase="D://myfiles" path="/showfile/show" reloadable="true" />
之後我訪問
localhost:8080/showfile/show/a.txt
就能看的D://myfiles/a.txt的內容了
而且我不給你地址,你就看不到檔案安全多了

但是還有一個問題,不能下載

我不想在瀏覽器裡看到txt文件,我想直接下載txt,可以麼?

可以

其實還有幾個問題在方案一里面,最重要的引數是xml的檔名,即使給context裡面加上path也不頂用
在方案二里面,server.xml裡面起作用的卻是contxt裡面的psth 有點奇怪哦




方案三

使用servlet


/**   
 * This class is used for ...   
 * @author  dlf([email protected])
 * @version 1.0, 2017年4月8日 下午11:53:35   
 */
@WebServlet(urlPatterns="/module/book/downtest")
public class DownloadFile extends HttpServlet{


	/**
	 * 
	 */
	private static final long serialVersionUID = -8663217572193783988L;
	
     /** 
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
     */  
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        // TODO Auto-generated method stub  
          
        //獲得請求檔名  
        String filenameISO = (String) request.getParameter("filename");
        
        String filenameUTF= new String(filenameISO.getBytes("ISO-8859-1"), "UTF-8");  
        
        System.out.println(filenameUTF);  
          
        //設定檔案MIME型別  
        response.setContentType(getServletContext().getMimeType(filenameUTF));  
        //設定Content-Disposition  
	//filename是ISO-8859-1的 如果改成utf-8 下載的檔名中就不能出現中文了
	//大家可以試試
        response.setHeader("Content-Disposition", "attachment;filename="+filenameISO);  
        response.setHeader("Content-type", "charset=UTF-8");  
        response.setCharacterEncoding("UTF-8");
        //讀取目標檔案,通過response將目標檔案寫到客戶端  


        //System.out.println(fullFileName);  
        //讀取檔案  
        InputStream in = new FileInputStream(Config.FAILED_FILE_PATH+filenameUTF);  
        OutputStream out = response.getOutputStream();  
          
        //寫檔案  
        int b;  
        while((b=in.read())!= -1)  {  
            out.write(b);  
        }  
          
        in.close();  
        out.close();  
    }  
  
    /** 
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
     */  
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        doGet(request, response);
    }  
  
}



參考文章

http://blog.csdn.net/yuan882696yan/article/details/26680253
http://www.cnblogs.com/gongchenglion/archive/2016/09/06/5846818.html