用 Tomcat 做文件下载服务器

按:这是一个零代码的实现,很有趣。

缘起

神舟上网本放在客厅下了很多东西,安装的系统是 Windows XP Pro,可惜那个盗版有点问题,一直无法正常共享文件,每次电影啥的下下来,要用移动硬盘去拷贝,烦,加之这移动硬盘是个有源盘(需要电源的移动硬盘), 更烦。遂考虑架一 FTP 服务,不过去看了下 Serv-U FTP,只有试用版。我用的盗版已经够多了,不忍再去找破解。用 IIS 吗?算了,不考虑。嘿,这段时间重温 Java EE,老用 Tomcat,那小本上不也装了吗?不如在 Tomcat 上运行一 webapp,在这个 webapp 上实现文件下载的功能。想到就做,但是,但是,突然想到 Tomcat 运行时,有个现象:如果 webapp 下没有指定缺省的显示页面,它会自动生成一页面,并且在这页面上列出当前 webapp 目录下所有的文件和目录的链接——呵呵,点点文件的链接不就可以下载了么?还不用写一行代码 ;)

具体实现

神舟小本的 IP: 172.168.1.104

Tomcat Version: 6.0.20(估计 6.X 都可)

待下载电影目录:D:\temp\fordownload

1. 在目标文件夹建立标准 Java EE 的 Webapp. 通过 Eclipse 建一 web 工程,工程的 web 根目录要选到 D:\temp\fordownload。

2. 设置 tomcat 的虚拟目录(鸣谢 ja_ll_ck)。在 {tomcat home}\conf\Catalina\localhost 下建一个任意名称的 XML,内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<Context path="/downloadmovie" reloadable="true" docBase="D:\temp\fordownload" crossContext="true">

</Context>

3. 允许 tomcat 列举文件。修改 {tomcat home}/conf/web.xml 的参数:

<init-param>

<param-name>listings</param-name>

<param-value>true</param-value>

</init-param>

上面默认的是 false,需要修改为 true。

好,现在启动 Tomcat,访问 http://172.168.1.104:8181/downloadmovie/ 就行了。

1. 以上第一步的目的是在 D:\temp\fordownload 下生成 WEB-INF 文件夹和里边的 web.xml 文件。如果手工完成这一步也不麻烦,在 D:\temp\fordownload 下创建如下目录结构:

D:\temp\fordownload

└─WEB-INF

└─lib

再把 web.xml 放到 WEB-INF 目录下就成。 web.xml 内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4"

xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

</web-app>

2. 对中文支持有问题,文件名或者路径名中包含中文的话,不能正常下载。解决方法是在 {home home}/conf/server.xml/<Connector> 元素里增添属性 URIEncoding="UTF-8". 参本站的《让 tomcat 支持中文 URL

3. 这个东西用起来,还是拖机器的,下载速度很高,局域网嘛,无线都有 1MiB/s,有线就更快了,下载的时候,机器卡住基本上干不了别的事,如果不是很急的文件,还是用移动硬盘拷贝比较方便,同时还可以通过网页查看文件夹里还有哪些文件。