【黄啊码】PHP实现文件下载,支持断点续传

举报
黄啊码 发表于 2022/07/04 23:19:40 2022/07/04
【摘要】  啊码一般废话比较少,直接甩代码,不懂扣我,再不懂就只能扣脚丫了,OK? PHP实现文件下载接口,支持断点续传,下载器可以查看文件大小。文件分片传输,内存消耗低。注意:使用时建议增加安全路径限制及可下载文件类型限制 /** * 文件下载 * @param string $file 文件绝对路径 */function dow...

 啊码一般废话比较少,直接甩代码,不懂扣我,再不懂就只能扣脚丫了,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. }

文章来源: markwcm.blog.csdn.net,作者:黄啊码,版权归原作者所有,如需转载,请联系作者。

原文链接:markwcm.blog.csdn.net/article/details/125593912

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。