千家信息网

nginx+php-fpm如何实现大文件下载

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,小编给大家分享一下nginx+php-fpm如何实现大文件下载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!示例如:set
千家信息网最后更新 2026年10月31日nginx+php-fpm如何实现大文件下载

小编给大家分享一下nginx+php-fpm如何实现大文件下载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

示例如:

set_time_limit(0);// 省略取文件路径的过程,这里直接是文件完整路径$filePath = get_save_path() . $File['save_name'];$filePath = realpath($filePath);$outFileExtension = strtolower(substr(strrchr($filePath, "."), 1)); //获取文件扩展名//根据扩展名 指出输出浏览器格式switch ($outFileExtension) {  case "exe" :    $ctype = "application/octet-stream";    break;  case "zip" :    $ctype = "application/zip";    break;  case "mp3" :    $ctype = "audio/mpeg";    break;  case "mpg" :    $ctype = "video/mpeg";    break;  case "avi" :    $ctype = "video/x-msvideo";    break;  default :    $ctype = "application/force-download";}header("Cache-Control:");header("Cache-Control: public");//设置输出浏览器格式header("Content-Type: $ctype");header("Content-Disposition: attachment; filename=" . basename($filePath));header("Accept-Ranges: bytes");$size = filesize($filePath);//如果有$_SERVER['HTTP_RANGE']参数if (isset ($_SERVER['HTTP_RANGE'])) {  /*Range头域   Range头域可以请求实体的一个或者多个子范围。  例如,  表示头500个字节:bytes=0-499  表示第二个500字节:bytes=500-999  表示最后500个字节:bytes=-500  表示500字节以后的范围:bytes=500-     第一个和最后一个字节:bytes=0-0,-1     同时指定几个范围:bytes=500-600,601-999     但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200 (OK)。  */  // 断点后再次连接 $_SERVER['HTTP_RANGE'] 的值 bytes=4390912-  list ($a, $range) = explode("=", $_SERVER['HTTP_RANGE']);  //if yes, download missing part  str_replace($range, "-", $range); //这句干什么的呢。。。。  $size2 = $size - 1; //文件总字节数  $new_length = $size2 - $range; //获取下次下载的长度  header("HTTP/1.1 206 Partial Content");  header("Content-Length: $new_length"); //输入总长  header("Content-Range: bytes $range$size2/$size"); //Content-Range: bytes 4908618-4988927/4988928  95%的时候} else {  //第一次连接  $size2 = $size - 1;  header("Content-Range: bytes 0-$size2/$size"); //Content-Range: bytes 0-4988927/4988928  header("Content-Length: " . $size); //输出总长}//打开文件$fp = fopen("$filePath", "rb");//设置指针位置if (!empty($range)) {  fseek($fp, $range);}//虚幻输出while (!feof($fp)) {  print (fread($fp, 1024 * 8)); //输出文件  flush(); //输出缓冲  ob_flush();}fclose($fp);exit ();

代码有详细的解释,也很清楚,但是在实际使用时还是小文件可以下载,大文件只能下载前半部分或者出现文件已损坏的情况。查看nginx日志发现如下报错

2018/08/01 07:43:20 [crit] 13906#0: *1479 open() "/usr/local/nginx/fastcgi_temp/0/02/0000000020" failed (13: Permission denied) while reading upstream,

原来在下载大文件时,文件大小超过配置的proxy_temp_file_write_size值时,nginx会将文件写入到临时目录下,如果该目录没有权限,就写不了,那下载只能下载缓从区的内容了。

核实/usr/local/nginx/fastcgi_temp/目录的权限分组,并不在nginx运行账号组下,即然知道了问题原因,那就好办了。给予写权限,或者将目录改为nginx运行账号组下就OK了

cd /usr/local/nginx/ chmod -R 766 fastcgi_temp/或者chown -R nginx:nginx fastcgi_temp/ #nginx根据各自情况可能是不能的账户

以上是"nginx+php-fpm如何实现大文件下载"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

文件 字节 输出 目录 内容 权限 篇文章 范围 文件下载 总长 情况 扩展名 格式 浏览器 账号 路径 浏览 运行 清楚 不怎么 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网是第几次科技革命的成果 北京路客互联网科技有限公司 互联网的科技 科技赋能下的互联网金融 美国互联网保险保险科技 上海互联网科技有限公司 碳银互联网科技 互联网科技生活的内容 互联网科技公司需要的职位 互联网金融中的现代科技 世界互联网科技公司市值排名 为客找房互联网科技公司怎么样 云南省自由互联网科技有限公司 互联网营销推广黑科技 四川互联网展示科技馆设计 互联网与数字科技关系 互联网领先科技活动 北京军民互联网科技公司 科技美学互联网 艺术 每日互联网科技新闻 科技企业和互联网企业 关于新基建和互联网科技 米客互联网科技 上海电发互联网科技有限公司 阿里巴巴算科技企业还是互联网 崇明区互联网教育科技诚信经营 搜狐科技互联网 广州市恰铎互联网科技有限公司 科技互联网经济论坛 上海互联网科技园景观
0