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');
- }
- }
以上就是PHP是如何实现下载断点续传?的详细内容,更多关于PHP是如何实现下载断点续传?的资料请关注九品源码其它相关文章!