PHP是如何实现下载断点续传?

后端开发   发布日期:2023年05月18日   浏览次数:389

php怎么实现下载断点续传?

PHP实现文件下载,支持断点续传

我一般废话比较少,直接甩代码,不懂扣我,再不懂就只能扣脚丫了,OK?

PHP实现文件下载接口,支持断点续传,下载器可以查看文件大小。文件分片传输,内存消耗低。注意:使用时建议增加安全路径限制及可下载文件类型限制

  1. /**
  2. * 文件下载
  3. * @param string $file 文件绝对路径
  4. */
  5. function download($file)
  6. {
  7. str_replace(['/','\\'], DIRECTORY_SEPARATOR, $file);
  8. //检查文件是否存在
  9. if (empty($file) or !is_file($file)) {
  10. die('文件不存在');
  11. }
  12. $fileName = basename($file);
  13. //以只读和二进制模式打开文件
  14. $fp = @fopen($file, 'rb');
  15. if ($fp) {
  16. // 获取文件大小
  17. $file_size = filesize($file);
  18. //告诉浏览器这是一个文件流格式的文件
  19. header('content-type:application/octet-stream');
  20. header('Content-Disposition: attachment; filename=' . $fileName);
  21. // 断点续传
  22. $range = null;
  23. if (!empty($_SERVER['HTTP_RANGE'])) {
  24. $range = $_SERVER['HTTP_RANGE'];
  25. $range = preg_replace('/[\s|,].*/', '', $range);
  26. $range = explode('-', substr($range, 6));
  27. if (count($range) < 2) {
  28. $range[1] = $file_size;
  29. }
  30. $range = array_combine(array('start', 'end'), $range);
  31. if (empty($range['start'])) {
  32. $range['start'] = 0;
  33. }
  34. if (empty($range['end'])) {
  35. $range['end'] = $file_size;
  36. }
  37. }
  38. // 使用续传
  39. if ($range != null) {
  40. header('HTTP/1.1 206 Partial Content');
  41. header('Accept-Ranges:bytes');
  42. // 计算剩余长度
  43. header(sprintf('content-length:%u', $range['end'] - $range['start']));
  44. header(sprintf('content-range:bytes %s-%s/%s', $range['start'], $range['end'], $file_size));
  45. // fp指针跳到断点位置
  46. fseek($fp, sprintf('%u', $range['start']));
  47. } else {
  48. header('HTTP/1.1 200 OK');
  49. header('Accept-Ranges:bytes');
  50. header('content-length:' . $file_size);
  51. }
  52. while (!feof($fp)) {
  53. echo fread($fp, 4096);
  54. ob_flush();
  55. }
  56. fclose($fp);
  57. } else {
  58. die('File loading failed');
  59. }
  60. }


以上就是PHP是如何实现下载断点续传?的详细内容,更多关于PHP是如何实现下载断点续传?的资料请关注九品源码其它相关文章!