PHP-HTTP断点续传实现

<?php

/**
 * PHP-HTTP断点续传实现
 * @username  张高伟
 * @param string $path: 文件所在路径
 * @param string $file: 文件名
 * @return void
 */

$file = '1.zip';
$file = 'counter.dat';
$size = filesize($file);

$size2 = $size-1;
$range = 0;
if(isset($_SERVER['HTTP_RANGE'])) { //http_range表示请求一个实体/文件的一个部分,用这个实现多线程下载和断点续传!
    header('HTTP /1.1 206 Partial Content');
    $range = str_replace('=','-',$_SERVER['HTTP_RANGE']);
    $range = explode('-',$range);
    $range = trim($range[1]);
    header('Content-Length:'.$size);
    header('Content-Range: bytes '.$range.'-'.$size2.'/'.$size);
} else {
    header('Content-Length:'.$size);
    header('Content-Range: bytes 0-'.$size2.'/'.$size);
}
header("Content-type: video/mp4");
header('Accenpt-Ranges: bytes');
header('Content-Type: application/octet-stream');
header("Cache-control: public");
header("Pragma: public");
// 解决在IE中下载时中文乱码问题
$ua = $_SERVER['HTTP_USER_AGENT'];
if(preg_match('/MSIE/',$ua)) { //表示正在使用 Internet Explorer    $ie_filename = str_replace('+','%20',urlencode($file));
    header ( "Content-Disposition: attachment; filename=$ie_filename;" );
} else {
    header ( "Content-Disposition: attachment; filename=$file;" );
}
$fp = fopen($file,'rb+');


fseek($fp,$range);    //fseek:在打开的文件中定位,该函数把文件指针从当前位置向前或向后移动到新的位置,新位置从文件头开始以字节数度量。成功则返回 0;否则返回 -1。注意,移动到 EOF 之后的位置不会产生错误。


while(!feof($fp)) {    //feof:检测是否已到达文件末尾 (eof)
    set_time_limit(0);    //控制运行时间
    print(fread($fp,1024));   //读取文件(可安全用于二进制文件,第二个参数:规定要读取的最大字节数)
    ob_flush();      //刷新PHP自身的缓冲区
    flush();      //刷新缓冲区的内容(严格来讲, 这个只有在PHP做为apacheModule(handler或者filter)安装的时候, 才有实际作用. 它是刷新WebServer(可以认为特指apache)的缓冲区.)
}
fclose($fp);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 PHP 中实现大文件上通过以下步骤进行: 1. 在客户端,创建一个包含文件上表单的 HTML 页面。确保表单中设置了 `enctype="multipart/form-data"` 属性,以支持文件上。 2. 在服务器端,接收客户端上的文件。通过 `$_FILES` 超全局变量获取上文件的相关信息,如文件名、临时文件路径等。 3. 可以对上文件进行一些验证,例如检查文件类型、大小等。可以使用 `$_FILES['file']['type']` 和 `$_FILES['file']['size']` 来获取文件的类型和大小。 4. 将临时文件移动到目标位置,使用 `move_uploaded_file()` 函数将临时文件移动到服务器上的指定目录。确保目标目录具有写入权限。 5. 可以在移动文件的过程中进行一些处理,例如分片上、进度显示等。这需要使用 JavaScript 和 AJAX 技术与服务器进行交互。 6. 如果需要,可以对上的文件进行进一步处理,例如存储文件信息到数据库中。 以下是一个简单的 PHP 代码示例,实现了基本的大文件上功能: ```php <?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $targetDir = 'path/to/upload/directory/'; // 目标存储目录 $file = $_FILES['file']; $fileName = $file['name']; $fileSize = $file['size']; $fileTmpPath = $file['tmp_name']; // 检查文件类型和大小等信息 // ... // 将临时文件移动到目标位置 $targetPath = $targetDir . $fileName; move_uploaded_file($fileTmpPath, $targetPath); // 其他处理逻辑 // ... } ?> <!DOCTYPE html> <html> <head> <title>大文件上示例</title> </head> <body> <h1>大文件上示例</h1> <form action="" method="POST" enctype="multipart/form-data"> <label for="file">选择文件:</label> <input type="file" name="file" id="file"> <input type="submit" value="上"> </form> </body> </html> ``` 在上述示例中,当用户选择文件并点击上按钮时,表单会将文件提交到同一页面(空 action 属性)。服务器端会接收到上的文件,将其移动到指定目录。你可以根据需要添加更多的验证和处理逻辑。 需要注意的是,对于大文件上,可能需要考虑分片上断点、进度显示等更复杂的功能和处理。以上示例只是一个基本的大文件上实现。如果需要更高级的功能,可能需要使用第三方库或框架来简化开发过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值