PHP是如何实现下载断点续传?
更新:2022-11-07 10:04:57
人气:582
来源:互联网转载
A+
php怎么实现下载断点续传?
PHP实现文件下载,支持断点续传
我一般废话比较少,直接甩代码,不懂扣我,再不懂就只能扣脚丫了,OK?
PHP实现文件下载接口,支持断点续传,下载器可以查看文件大小。文件分片传输,内存消耗低。注意:使用时建议增加安全路径限制及可下载文件类型限制
/** * 文件下载 * @param string $file 文件绝对路径 */ function download($file) { str_replace(['/','\\'], DIRECTORY_SEPARATOR, $file); //检查文件是否存在 if (empty($file) or !is_file($file)) { die('文件不存在'); } $fileName = basename($file); //以只读和二进制模式打开文件 $fp = @fopen($file, 'rb'); if ($fp) { // 获取文件大小 $file_size = filesize($file); //告诉浏览器这是一个文件流格式的文件 header('content-type:application/octet-stream'); header('Content-Disposition: attachment; filename=' . $fileName); // 断点续传 $range = null; if (!empty($_SERVER['HTTP_RANGE'])) { $range = $_SERVER['HTTP_RANGE']; $range = preg_replace('/[\s|,].*/', '', $range); $range = explode('-', substr($range, 6)); if (count($range) < 2) { $range[1] = $file_size; } $range = array_combine(array('start', 'end'), $range); if (empty($range['start'])) { $range['start'] = 0; } if (empty($range['end'])) { $range['end'] = $file_size; } } // 使用续传 if ($range != null) { header('HTTP/1.1 206 Partial Content'); header('Accept-Ranges:bytes'); // 计算剩余长度 header(sprintf('content-length:%u', $range['end'] - $range['start'])); header(sprintf('content-range:bytes %s-%s/%s', $range['start'], $range['end'], $file_size)); // fp指针跳到断点位置 fseek($fp, sprintf('%u', $range['start'])); } else { header('HTTP/1.1 200 OK'); header('Accept-Ranges:bytes'); header('content-length:' . $file_size); } while (!feof($fp)) { echo fread($fp, 4096); ob_flush(); } fclose($fp); } else { die('File loading failed'); } }
推荐的文章
随手记
- ● 统信UOS开机指定网址全屏启动自带浏览器以及屏蔽ALT+F4关闭
- ● xshellSSH连接Linux服务器防止超时退出
- ● php8开启OpenSSL扩展库报错disabledinstallext
- ● 统信系统linux安装php时的报错libxml-2.0>=2.7.6
- ● tidb关闭sql_mode=ONLY_FULL_GROUP_BY模式
- ● windows10如何开机自动运行bat文件
- ● Win10Mysql8初始密码丢失,初始化又不显示密码
- ● UOS系统关闭防火墙或者放行tcp80端口
- ● 统信系统UOS纯命令行与图形模式界面桌面切换方法
- ● javascript(js)的小数点乘法除法问题详解
PHP经验分享
- ● PHP代码用UDP方式远程唤醒电脑让计算机开机
- ● apache下php生成验证码图片不能显示
- ● PHP使用AES加密解密示例(无偏移)
- ● Pluginmysql_native_passwordreported:''mysql_native_password'isdeprecate问题
- ● PHP实现计算CRC-16/MODBUS校验位
- ● MySQLSUM在没有符合查询条件时返回结果为空的处理办法
- ● 如何开启PHP8的JIT提升运行速度
- ● 钉钉API接口-用PHP+Curl实现获取用户信息
- ● 钉钉API接口-用PHP+Curl实现获取应用Access_Token
- ● 在PHP中使用CURL,“撩”服务器只需几行——phpcurl详细解析和常见大坑