好得很程序员自学网
  • 首页
  • 后端语言
    • C#
    • PHP
    • Python
    • java
    • Golang
    • ASP.NET
  • 前端开发
    • Angular
    • react框架
    • LayUi开发
    • javascript
    • HTML与HTML5
    • CSS与CSS3
    • jQuery
    • Bootstrap
    • NodeJS
    • Vue与小程序技术
    • Photoshop
  • 数据库技术
    • MSSQL
    • MYSQL
    • Redis
    • MongoDB
    • Oracle
    • PostgreSQL
    • Sqlite
    • 数据库基础
    • 数据库排错
  • CMS系统
    • HDHCMS
    • WordPress
    • Dedecms
    • PhpCms
    • 帝国CMS
    • ThinkPHP
    • Discuz
    • ZBlog
    • ECSHOP
  • 高手进阶
    • Android技术
    • 正则表达式
    • 数据结构与算法
  • 系统运维
    • Windows
    • apache
    • 服务器排错
    • 网站安全
    • nginx
    • linux系统
    • MacOS
  • 学习教程
    • 前端脚本教程
    • HTML与CSS 教程
    • 脚本语言教程
    • 数据库教程
    • 应用系统教程
  • 新技术
  • 编程导航
    • 区块链
    • IT资讯
    • 设计灵感
    • 建站资源
    • 开发团队
    • 程序社区
    • 图标图库
    • 图形动效
    • IDE环境
    • 在线工具
    • 调试测试
    • Node开发
    • 游戏框架
    • CSS库
    • Jquery插件
    • Js插件
    • Web框架
    • 移动端框架
    • 模块管理
    • 开发社区
    • 在线课堂
    • 框架类库
    • 项目托管
    • 云服务

当前位置:首页>后端语言>PHP
<tfoot draggable='sEl'></tfoot>

php分段+断点续传 php实现断点续传

很多站长朋友们都不太清楚php分段+断点续传,今天小编就来给大家整理php分段+断点续传,希望对各位有所帮助,具体内容如下:

本文目录一览: 1、 php 断点续传怎么做啊! 2、 php如何实现断点续传 3、 php 怎么写断点续传 有插件也行 求大神 php 断点续传怎么做啊!

功能:支持断点续传的下载,能计算传输率,能控制传输率

简易使用方法:

$object = new httpdownload();

$object->set_byfile($file)%N#H#%;//服务器文件名,包括路径

$object->filename = $filename;//下载另存为的文件名

$object->download();

3.源文件:

<?

class httpdownload {

var $data = null;

var $data_len = 0;

var $data_mod = 0;

var $data_type = 0;

var $data_section = 0; //section download

var $sentSize=0;

var $handler = array('auth' => null);

var $use_resume = true;

var $use_autoexit = false;

var $use_auth = false;

var $filename = null;

var $mime = null;

var $bufsize = 2048;

var $seek_start = 0;

var $seek_end = -1;

var $totalsizeref = 0;

var $bandwidth = 0;

var $speed = 0;

function initialize() {

global $HTTP_SERVER_VARS;

if ($this->use_auth) //use authentication {

if (!$this->_auth()) //no authentication {

header('WWW-Authenticate: Basic realm="Please enter your username and password"');

header('HTTP/1.0 401 Unauthorized');

header('status: 401 Unauthorized');

if ($this->use_autoexit) exit();

return false;

}

}

if ($this->mime == null) $this->mime = "application/octet-stream"; //default mime

if (isset($_SERVER['HTTP_RANGE']) || isset($HTTP_SERVER_VARS['HTTP_RANGE'])) {

if (isset($HTTP_SERVER_VARS['HTTP_RANGE'])) $seek_range = substr($HTTP_SERVER_VARS['HTTP_RANGE'] , strlen('bytes='));

else $seek_range = substr($_SERVER['HTTP_RANGE'] , strlen('bytes='));

$range = explode('-',$seek_range);

if ($range[0] > 0) {

$this->seek_start = intval($range[0]);

}

if ($range[1] > 0) $this->seek_end = intval($range[1]);

else $this->seek_end = -1;

if (!$this->use_resume) {

$this->seek_start = 0;

//header("HTTP/1.0 404 Bad Request");

//header("Status: 400 Bad Request");

//exit;

//return false;

} else {

$this->data_section = 1;

}

} else {

$this->seek_start = 0;

$this->seek_end = -1;

}

$this->sentSize=0;

return true;

}

function header($size,$seek_start=null,$seek_end=null) {

header('Content-type: ' . $this->mime);

header('Content-Disposition: attachment; filename="' . $this->filename . '"');

header('Last-Modified: ' . date('D, d M Y H:i:s /G/M/T' , $this->data_mod));

if ($this->data_section $this->use_resume) {

header("HTTP/1.0 206 Partial Content");

header("Status: 206 Partial Content");

header('Accept-Ranges: bytes');

header("Content-Range: bytes $seek_start-$seek_end/$size");

header("Content-Length: " . ($seek_end - $seek_start + 1));

} else {

header("Content-Length: $size");

}

}

function download_ex($size) {

if (!$this->initialize()) return false;

ignore_user_abort(true);

//Use seek end here

if ($this->seek_start > ($size - 1)) $this->seek_start = 0;

if ($this->seek_end <= 0) $this->seek_end = $size - 1;

$this->header($size,$seek,$this->seek_end);

$this->data_mod = time();

return true;

}

function download() {

if (!$this->initialize()) return false;

try {

error_log("begin download/n", 3,"/usr/local/www/apache22/LOGS/apache22_php.err");

$seek = $this->seek_start;

$speed = $this->speed;

$bufsize = $this->bufsize;

$packet = 1;

//do some clean up

@ob_end_clean();

$old_status = ignore_user_abort(true);

@set_time_limit(0);

$this->bandwidth = 0;

$size = $this->data_len;

if ($this->data_type == 0) //download from a file {

$size = filesize($this->data);

if ($seek > ($size - 1)) $seek = 0;

if ($this->filename == null) $this->filename = basename($this->data);

$res = fopen($this->data,'rb');

if ($seek) fseek($res , $seek);

if ($this->seek_end < $seek) $this->seek_end = $size - 1;

$this->header($size,$seek,$this->seek_end); //always use the last seek

$size = $this->seek_end - $seek + 1;

while (!(connection_aborted() || connection_status() == 1) $size > 0) {

if ($size < $bufsize) {

echo fread($res , $size);

$this->bandwidth += $size;

$this->sentSize+=$size;

} else {

echo fread($res , $bufsize);

$this->bandwidth += $bufsize;

$this->sentSize+=$bufsize;

}

$size -= $bufsize;

flush();

if ($speed > 0 ($this->bandwidth > $speed*$packet*1024)) {

sleep(1);

$packet++;

}

}

fclose($res);

}

elseif ($this->data_type == 1) //download from a string

{

if ($seek > ($size - 1)) $seek = 0;

if ($this->seek_end < $seek) $this->seek_end = $this->data_len - 1;

$this->data = substr($this->data , $seek , $this->seek_end - $seek + 1);

if ($this->filename == null) $this->filename = time();

$size = strlen($this->data);

$this->header($this->data_len,$seek,$this->seek_end);

while (!connection_aborted() $size > 0) {

if ($size < $bufsize) {

$this->bandwidth += $size;

$this->sentSize+=$size;

} else {

$this->bandwidth += $bufsize;

$this->sentSize+=$bufsize;

}

echo substr($this->data , 0 , $bufsize);

$this->data = substr($this->data , $bufsize);

$size -= $bufsize;

flush();

if ($speed > 0 ($this->bandwidth > $speed*$packet*1024)) {

sleep(1);

$packet++;

}

}

} else if ($this->data_type == 2) {

//just send a redirect header

header('location: ' . $this->data);

}

if($this->totalsizeref==$this->sentSize )error_log("end download/n", 3,"/usr/local/www/apache22/LOGS/apache22_php.err");

else error_log("download is canceled/n", 3,"/usr/local/www/apache22/LOGS/apache22_php.err");

if ($this->use_autoexit) exit();

//restore old status

ignore_user_abort($old_status);

set_time_limit(ini_get("max_execution_time"));

}

catch(Exception $e) {

error_log("cancel download/n".$e, 3,"/usr/local/www/apache22/LOGS/apache22_php.err");

}

return true;

}

function set_byfile($dir) {

if (is_readable($dir) is_file($dir)) {

$this->data_len = 0;

$this->data = $dir;

$this->data_type = 0;

$this->data_mod = filemtime($dir);

$this->totalsizeref = filesize($dir);

return true;

} else return false;

}

function set_bydata($data) {

if ($data == '') return false;

$this->data = $data;

$this->data_len = strlen($data);

$this->data_type = 1;

$this->data_mod = time();

return true;

}

function set_byurl($data) {

$this->data = $data;

$this->data_len = 0;

$this->data_type = 2;

return true;

}

function set_lastmodtime($time) {

$time = intval($time);

if ($time <= 0) $time = time();

$this->data_mod = $time;

}

function _auth() {

if (!isset($_SERVER['PHP_AUTH_USER'])) return false;

if (isset($this->handler['auth']) function_exists($this->handler['auth'])) {

return $this->handler['auth']('auth' , $_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']);

} else return true; //you must use a handler

}

}

?>

php如何实现断点续传

可以通过$_SERVER['HTTP_RANGE']取得用户请求的文件的range来实现。

其实说简单点就是通过这个变量$_SERVER['HTTP_RANGE']取得用户请求的文件的range,然后程序去控制文件的输出。比如第一次请求一个文件的从0到999字节,第二次请求1000到1999字节,以此类推,每次请求1000字节的内容,然后程序通过fseek函数去取得对应的文件位置,然后输出。

网上有很多这样的教程可以去查一查。

php 怎么写断点续传 有插件也行 求大神

HTTP协议里, 对断点下载有支持.

断点上传单纯靠PHP 是做不了的.

因为普通的浏览器端没那功能.(上传的时候 还是会整个文件编码发送)

想实现的话 , 客户端需要插件了,

客户端可以使用flex实现. 服务端, PHP可以写个webservice 接受文件.

可以在网上找找. 关键字: "flex php 上传"

大文件上传, 走 http 是比较费劲儿的.  不稳定是关键.

关于php分段+断点续传的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。

查看更多关于php分段+断点续传 php实现断点续传的详细内容...

声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did209505
更新时间:2023-05-03   阅读:31次

上一篇: php网页开发mac php网页开发与设计 李辉

下一篇:php点卡充值数据 php充值系统

相关资讯

最新资料更新

  • 1.php文章发布系统 php发布网站
  • 2.php数组冒泡排序 php冒泡排序面试题
  • 3.php网页滚动代码 php 如何做滑动加载
  • 4.关于php用户同时登录的信息
  • 5.php配置外网访问 phpstudy外网映射
  • 6.文章加载更多php php加载html
  • 7.php框架制作教程外包 怎么做php框架
  • 8.php生成uuid php生成随机6位数
  • 9.phpajix的简单介绍
  • 10.phpapache占有 php apc缓存
  • 11.php项目基本流程 php项目如何运行
  • 12.php推荐接口排重 接口 php
  • 13.php会做流控吗 php流程控制
  • 14.修改文件限制php php修改上传文件大小
  • 15.php的token请求 php简单的token验证
  • 16.怎么写php需求 php市场需求
  • 17.口袋源码php下载 口袋com
  • 18.php识别条码 php代码扫描
  • 19.php登录和注册 php登录和注册不使用数据库
  • 20.php变量获取图片 php调用图片

CopyRight:2016-2025好得很程序员自学网 备案ICP:湘ICP备09009000号-16 http://haodehen.cn
本站资讯不构成任何建议,仅限于个人分享,参考须谨慎!
本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。

网站内容来源于网络分享,如有侵权发邮箱到:kenbest@126.com,收到邮件我们会即时下线处理。
网站框架支持:HDHCMS   51LA统计 百度统计
Copyright © 2018-2025 「好得很程序员自学网」
[ SiteMap ]