Nginx是一个高性能的Web服务器和反向代理服务器,而PHP是一种脚本语言,常用于网站的后台服务。在许多网站应用程序中,需要支持下载功能,也就是需要用户能够方便地下载文件,如软件、文档、图片等。此时,Nginx和PHP就可以结合起来实现这一功能。
一般而言,实现下载功能的核心就是构造一个HTTP响应,告诉浏览器要下载的文件的类型、大小和名称,以及文件的实际内容。首先,我们可以用Nginx配置一个location,用于处理下载请求:
location /download/ {
root /www/data/files/;
}
这个location的作用是把所有通过/download/路径请求的URL都直接映射到/www/data/files/目录下。那么如何判断一个请求是否是下载请求呢?可以用文件扩展名来进行判断:if ($request_uri ~* ^/download/(.+)\.(mp3|pdf|zip|txt)$) {
add_header Content-Disposition 'attachment; filename="$1.$2"';
}
如果请求的URL路径以/download/开头,并且以.mp3、.pdf、.zip或.txt为扩展名,那么就把响应的Content-Disposition头设置为attachment,表明这是一个下载响应。具体的文件名可以从正则表达式中提取出来。
处理完了Nginx的配置,下一步就是PHP的工作了。首先需要获取要下载的文件的路径和名称:$file = '/www/data/files/'.$filename;
$basename = basename($file);
$size = filesize($file);
然后,就可以开始发送文件内容:header('Content-Type: application/octet-stream');
header('Content-Length: '.$size);
header('Content-Disposition: attachment; filename="'.$basename.'"');
$fp = fopen($file, 'rb');
while (!feof($fp)) {
echo fread($fp, 8192);
}
fclose($fp);
这里,我们首先设置响应的Content-Type为application/octet-stream,表示这是一个二进制流的文件。然后,设置Content-Length头为文件的大小,以及Content-Disposition头为attachment,文件名为$basename。最后,打开文件并逐个读取,输出到浏览器。需要注意的是,这里每次输出8192字节,以免一次读取过多占用过多内存。
通过这样的方式,我们就可以实现简单的文件下载功能了。需要注意的是,这种方式只适合小文件的下载,对于大文件,需要考虑分段下载以节约资源。同时,也应当注意安全问题,如文件夹权限的设置、恶意文件的上传、目录遍历等。