從tomcat下載檔案
阿新 • • 發佈:2019-01-08
其實最開始的需求,就是希望使用tomcat下載伺服器上的一些檔案。
當然如果檔案就放在{tomcat_home}/webapp/myproject/下那一切都好辦。
但是把自己放在這裡,每次eclipse那邊一啟動,東西就沒了。不合適。
1、在tomcat 安裝目錄\conf\Catalina\localhost下建立任意檔名xml檔案,比如:download_file.xml,
內容如下:
2、配置web.xml(tomcat的配置檔案),修改如下配置:
然後重啟tomcat,訪問localhost:8080/download_file。
記住訪問的工程名就是剛才新建的那個xml檔案的名字。
就能看的如下圖的介面:
如果我不想讓使用者看所有的問題,只想讓使用者看某些檔案,怎麼辦。
{tomcat_home}/conf/serer.xml中的server/service/engine/host下
增加
localhost:8080/showfile/show/a.txt
就能看的D://myfiles/a.txt的內容了。
而且我不給你地址,你就看不到檔案。安全多了。
http://www.cnblogs.com/gongchenglion/archive/2016/09/06/5846818.html
當然如果檔案就放在{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的配置檔案),修改如下配置:
要將listings的false改為true。<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>
然後重啟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/26680253http://www.cnblogs.com/gongchenglion/archive/2016/09/06/5846818.html