php上传断点续传

Ⅰ 求php上传大文件的三种解决方案

第一种是使用第三方的存储空间,这种比较方便,也不需要你做什么,直接请求接口就好啦。
第二种可以使用ftp方式进行大文件上传,支持断点续传。
第三种是用php调用服务端程序来上传,比如调用python等等开发的上传功能

Ⅱ PHP 大文件上传,支持断点续传,求具体方案、源码或者文件上传插件

HTTP协议里, 对断点下载有支持.
断点上传单纯靠PHP 是做不了的.
因为普通的浏览器端没那功能.(上传的时候 还是会整个文件编码发送)
想实现的话 , 客户端需要插件了,
客户端可以使用flex实现. 服务端, PHP可以写个webservice 接受文件.

Ⅲ 求php 以上超大文件上传和断点续传服务器的实现

现在这个时代文件存储基本分离到了单独的存储服务上面,比如说阿里云的OSS,七牛云的云存储等等.考虑这些第三方服务的话,那么你的大文件上传和断点续传等功能实现只需要去对接服务商提供的API接口即可(好处就是上传服务的压力等因素服务商帮你抗,不好就是你得付钱给服务商),其中方案就是js-sdk只传OSS的方式,稳定性好,只传断点续传和实时浏览上传进度。
如果你是大神,需要自己在服务器实现上述功能,那么要考虑的不仅是实现本身的需求,还得考虑服务器是否能抗得住这样的上传压力(带宽,延时),还有存储空间是否足够等额外的问题.

Ⅳ php 断点续传怎么做啊!

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

简易使用方法:

$object = new httpdownload();
o b j e c t − > s e t b y f i l e ( object->set_byfile( object>setbyfile(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 大文件上传解决方案(500M以上)

针对这种问题,我想从如下几方面着手:
1.首先还是查看环境是否支持超大容量上传的支持,500M以上的文件通常为视频文件;
2.即然他要上传500M以上的文件,估计服务器性能必定非同凡想,所以暂可不考虑服务器硬件配置问题,但一定要考虑到网速问题,建议1000M以上出入速率,如少于这个数,你可以放弃这个方案了;
3.前面硬件都过关了,但程序也要加强了,一下上传500M是哪种语言都不能实现的,唯一解决方案,文件切割,如迅雷下载原理一样(采用续点上传),分成若干小块,然后全部上传完毕以后,再进行文件合成。
4.至于PHP的文件切割,切割后上传,以及文件合并,此类代码网上有许多,楼主可查询并选择适合你的代码,实现你的功能!

以上思路希望能帮到你!

参考文章:http://blog.ncmem.com/wordpress/2023/09/19/php%e4%b8%8a%e4%bc%a0%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0/
欢迎入群一起讨论

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
百度WebUploader是一个基于HTML5的文件上传组件,它支持多文件、分片上传断点续传等功能。要实现图片批量上传,可以结合PHP来完成。 首先,引入WebUploader插件及其样式文件。然后在HTML中创建一个容器,用来展示上传按钮和上传结果的反馈信息。 接下来,在PHP文件中设置图片上传的相关配置。首先要指定上传的文件类型为图片类型,通过设置`accept`属性为`image/*`实现。 在PHP文件中,使用`$_FILES`来获取上传的文件信息。通过遍历`$_FILES`数组,可以获取到每个文件的相关属性,如文件名、大小、临时路径等。 然后,可以使用PHP的文件处理函数来对每个上传的文件进行处理,比如判断文件大小是否在限定范围内,判断文件类型是否为图片等。可以使用`getimagesize()`函数来判断文件是否为图片。 对于合法的图片文件,可以使用`move_uploaded_file()`函数将其从临时目录移动到指定的目录中,同时生成新的文件名,以防止文件名重复。可以使用`uniqid()`函数生成一个唯一的文件名,拼接上原文件的后缀名。 在处理完所有上传的文件后,可以将结果返回给前端页面。可以通过`json_encode()`函数将结果以JSON格式返回,其中包括上传成功的文件名和上传失败的文件列表。 最后,在前端页面的JavaScript代码中,使用百度WebUploader的API方法来实现上传功能。通过监听`fileQueued`事件,将每次选择的文件添加到队列中。可以通过设定`auto=true`来将文件自动上传。 在监听到`uploadSuccess`事件时,可以获取到上传成功的文件名,可以使用JavaScript动态生成一个缩略图,并显示在页面上。 总结起来,实现百度WebUploader图片批量上传PHP,主要包括:引入WebUploader插件和样式文件、在PHP中设置文件上传的配置、通过`$_FILES`获取上传文件的信息、判断上传的文件是否为图片并处理、返回上传结果给前端页面、在前端页面通过监听事件实现上传功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值