最近在做一个项目,是帮用户管理媒体文件,主要负责媒体文件的上传,下载(不是视频点播,只是上传下载而已).用户的文件通常都很大,500M+,有时候1G,不过是企业内部网,用户在30个人左右。用户提供的服务器如下:一台志强4核的服务器,Windows2003,4G内存。由于用户每年要上传的文件都有100G+,所以不可能把用户上传的文件放在应用程序的public下,在程序中提供了一个管理功能,在一个盘被塞满的情况下可以让用户更改上传目录。这么一来,数据库保存的就是该文件的绝对物理地址。
现在问题来了:在下载文件的时候,如果用send_file的话1G以上的文件无法下载,0.99G的就可以,非常郁闷,而且用mongel服务器,多个用户下载的时候,绝对挂。。。所以就要改成静态文件的下载方式。但是上传的文件并没有放在public下面,该怎么办呢???
请教了很多人。结果得到的一致的方法:用虚拟目录。
假如我现在文件上传的目录是c:\MEDIAFILES
1)先开始想到的是apache,毕竟部署的时候是用apache+mongel,于是改动apache的配置文件加入如下代码:
<IfModule dir_module>
DirectoryIndex index.html
Alias /c c:/MEDIAFILES
<Directory c:/MEDIAFILES>
Options MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</IfModule>
然后在超连接中这么写:
<a href="http://202.101.165.245/c/200812/200812161600022501.rar">download</a>
但是结果令人失望,运行时候就报出route错误。(个人分析是因为apache根本就不知道你要下载的那个资源是静态资源,所以将请求转发给mongel)
2) 既然apache不行,那就换个服务器,毕竟支持虚拟目录的服务器还是蛮多的。于是我选用了tomcat。安装好tomcat后,配置一下tomcat下的conf目录下的server.xml文件,在下面加上如下代码
<Context path="/c" docBase="C:\MEDIAFILES" reloadable="true" debug="0"></Context>
运行tomcat。然后点击"download",OK,一切搞定。。。
如果以后更换了上传目录,那么就在server.xml中,再重新加上
<Context path="/e" docBase="e:\MEDIAFILES" reloadable="true" debug="0"></Context>
就OK了。。
到这里,问题总算告一段落,虽然解决了问题,但是总觉得心里不爽,毕竟这种方式还是蛮拙劣的。别问我为啥不用linux,为啥不搞个专门的文件服务器。。。。。。。如果真的可以的话,就不会有今天这篇文章了。
如果大家有更好的办法。请提出,我们共同学习。呵呵……