要做一个下载的程序,如果直接是一个真实的文件链接,那么下载就无法进行控制。
可以使用CGI程序将文件从服务器读出来,然后提交客户端下载。这个虽然可以在CGI程序里进行控制,但下载效率很低,对系统资源消耗高。最好的方法就是先用CGI程序控制文件的下载,然后将下载文件的任务交给web服务器。
下面就是我利用nginx做的一次实验。
X-Accel-Redirect:官方解释为http://wiki.nginx.org/NginxXSendfile
我在nginx的配置文件里,添加下面的配置信息:
location /down { internal; alias C:/QMDownload/test; }
我的php代码为:
header("Content-Type: application/force-download"); #表明是一个下载请求 header('Accept-Range : byte '); #文件单位 header('Accept-Length: 3428'); #文件长度 header('Content-Disposition: attachment; filename=file.txt');#文件名 header("X-Accel-Redirect: /down/file.txt"); #nginx重定向请求
在这个配置信息中:
第一行:表明监控/down的请求。
第二行:表示这是一个服务器内部请求,不会泄漏给客户端。
第三秆:别名,设置为文件存放的真实位置。
在PHP程序中:前面四行就是告诉浏览器,这是一个下载请求,文件大小,文件名。最后一行,就是使用X-Accel-Redirect告诉浏览器文件在服务器的位置。file.txt这个文件在我电脑的位置为:“C:/QMDownload/test”,php网站目录为:C:/nginx-0.9.4/html。
运行PHP时,X-Accel-Redirect会跳转文件到/down/file.txt,而在nginx里将down转换成内部路径C:/QMDownload/test,nginx就能直接读取到真实的文件路径“C:/QMDownload/test/file.txt”,并提交浏览器下载。