php 上傳視頻(分片)

分片上傳視頻畜疾,網(wǎng)上部分博客總結(jié)的使用方法模糊不清楚赴邻,自己總結(jié)的小demo,親測(cè)可用啡捶!粘貼代碼即可使用姥敛!不懂的可以留言!大家一起討論瞎暑!

index.html部分

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        #progress{
            width: 300px;
            height: 20px;
            background-color:#f7f7f7;
            box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);
            border-radius:4px;
            background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);
        }

        .finish{
            background-color: #149bdf;
            background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
            background-size:40px 40px;
            height: 100%;
        }
        form{
            margin-top: 50px;
        }
    </style>
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
</head>
<body>
    
<div id="progress">
    <div id="finish_video" class="finish" style="width: 0%;" progress="0"></div>
    <input type="hidden" name="VideoName" id="VideoName">
</div>
<div class="btn-group">
    <input id="video_file" type="file" class="file-input" style="visibility: hidden">
    <span class="btn btn-info btn-upload" style="float:left;" onclick="$(this).prev('input').trigger('click'); ">上傳視頻</span>
</div>

<script>
    //分片上傳
    //上傳視頻
    var fileNameTime = Date.parse(new Date())/1000;

    var video_file = document.getElementById("video_file");
    var jdt_s = document.getElementById('finish_video');
    var ipt_s = $('#VideoName');
    var video_upload = new Upload(jdt_s,ipt_s);
    video_file.onchange = function(){
        fileNameTime = fileNameTime+1;
        video_upload.addFileAndSend(this);
    };

    function Upload(jdt,ipt){
        const LENGTH = 1024 * 1024;
        var start = 0;
        var end = start + LENGTH;
        var blob;
        var blob_num = 1;
        var is_stop = 0;
        //對(duì)外方法彤敛,傳入文件對(duì)象
        this.addFileAndSend = function(that){
            var file = that.files[0];
            blob = cutFile(file);
            sendFile(blob,file);
            blob_num  += 1;
        };
        //切割文件
        function cutFile(file){
            var file_blob = file.slice(start,end);
            start = end;
            end = start + LENGTH;
            return file_blob;
        }
        //發(fā)送文件
        function sendFile(blob,file){
            var xhr = new XMLHttpRequest();
            var form_data = new FormData();
            var total_blob_num = Math.ceil(file.size / LENGTH);
            form_data.append('file',blob);
            form_data.append('blob_num',blob_num);
            form_data.append('total_blob_num',total_blob_num);
            form_data.append('file_name',fileNameTime+file.name.substr(file.name.lastIndexOf(".")));

            //xhr.open('POST','http://lh/sp/index.php',false); //上傳文件的路徑
            xhr.open('POST','http://lh/sp/index.php',false);
            xhr.onreadystatechange  = function () {
                var progress;
                var progressObj = jdt;
                if(total_blob_num == 1){
                    progress = '100%';
                }else{
                    progress = Math.min(100,(blob_num/total_blob_num)* 100 ) +'%';
                }
                progressObj.style.width = progress;
                progressObj.innerHTML=progress;
                var t = setTimeout(function(){
                    if(start < file.size && is_stop === 0){
                        blob = cutFile(file);
                        sendFile(blob,file);
                        blob_num  += 1;
                    }else{
                        var responsePath = xhr.responseText;
                        var firstPath = responsePath.indexOf("{");
                        var lastPath = responsePath.indexOf("}");
                        var pathReturn = responsePath.substr(firstPath,lastPath-firstPath+1);
                        var pathReturnObj = eval('(' + pathReturn + ')');
                        ipt.val(pathReturnObj.file_path);
                        alert('上傳成功');
                        xhr = undefined;
                        form_data = undefined;
                    }
                },1000);
            };
            xhr.send(form_data);
        }
    }

</script>

    
</body>
</html>

index.php部分

<?php 

class UploadService
{
    private $filepath;
    private $tmpPath;  //PHP文件臨時(shí)目錄
    private $blobNum; //第幾個(gè)文件塊
    private $totalBlobNum; //文件塊總數(shù)
    private $fileName; //文件名
    private $savePath; //保存路徑
    private $basePath;

    public function __construct($type, $tmpPath,$blobNum,$totalBlobNum,$fileName){
        $this->tmpPath =  $tmpPath;
        $this->blobNum =  $blobNum;
        $this->totalBlobNum =  $totalBlobNum;
        $this->fileName =  $fileName;
        $this->savePath =  date('Ymd',mb_substr($fileName,0,10));
        $this->DataPath = date('Ymd',time());
        $this->filepath = __DIR__.'/public/uploads/'.$type .'/'.$this->DataPath.'/'; //提前建立 __DIR__ 目錄 因?yàn)闆](méi)有創(chuàng)建權(quán)限
        $this->basePath = __DIR__.'/public/uploads/'.$type;
    }

    //判斷是否是最后一塊,如果是則進(jìn)行文件合成并且刪除文件塊
    private function fileMerge(){
        if($this->blobNum == $this->totalBlobNum){
            $blob = '';
            for($i=1; $i<= $this->totalBlobNum; $i++){
                $blob .= file_get_contents($this->filepath.'/'. $this->fileName.'__'.$i);
            }
            file_put_contents($this->filepath.'/'. $this->fileName,$blob);
            $this->deleteFileBlob();
        }
    }

    //刪除文件塊
    private function deleteFileBlob(){
        for($i=1; $i<= $this->totalBlobNum; $i++){
            @unlink($this->filepath.'/'. $this->fileName.'__'.$i);
        }
    }

    //移動(dòng)文件
    private function moveFile(){
        $this->touchDir();
        $filename = $this->filepath.'/'. $this->fileName.'__'.$this->blobNum;
        move_uploaded_file($this->tmpPath,$filename);
    }

    //API返回?cái)?shù)據(jù)
    public function apiReturn(){
        if(!file_exists($this->basePath)){
            mkdir($this->basePath);
        }
        $this->moveFile();
        $this->fileMerge();
        if($this->blobNum == $this->totalBlobNum){
            if(file_exists($this->filepath.'/'. $this->fileName)){
                $data['code'] = 2;
                $data['msg'] = 'success';
    //$_SERVER['DOCUMENT_URI']=>$_SERVER['REQUEST_URI']
    //$data['file_path'] = 'http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['REQUEST_URI']).str_replace('.','',$this->filepath).'/'. $this->fileName;
                $data['file_path'] = '/uploads/video/'.$this->DataPath.'/'.$this->fileName;
            }
        }else{
            if(file_exists($this->filepath.'/'. $this->fileName.'__'.$this->blobNum)){
                $data['code'] = 1;
                $data['msg'] = 'waiting for all';
                $data['file_path'] = '';
            }
        }
        header('Content-type: application/json');
        echo json_encode($data);
    }

    //建立上傳文件夾
    private function touchDir(){
        if(!file_exists($this->filepath)){
            mkdir($this->filepath);
        }
    }

}

function cut_upload()
{   

    ini_set('memory_limit', '200M');
    //ini_set('memory_limit', '-1');//目前視頻上傳受 file_put_content()函數(shù)占用內(nèi)存影響
    //實(shí)例化并獲取系統(tǒng)變量傳參
    $upload = new UploadService('video',$_FILES['file']['tmp_name'],$_POST['blob_num'],$_POST['total_blob_num'],$_POST['file_name']);
    //調(diào)用方法了赌,返回結(jié)果
    $upload->apiReturn();
}

cut_upload();

目錄結(jié)構(gòu)

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末墨榄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子勿她,更是在濱河造成了極大的恐慌袄秩,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逢并,死亡現(xiàn)場(chǎng)離奇詭異之剧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)砍聊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)背稼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人玻蝌,你說(shuō)我怎么就攤上這事雇庙。” “怎么了灶伊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)寒跳。 經(jīng)常有香客問(wèn)我聘萨,道長(zhǎng),這世上最難降的妖魔是什么童太? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任米辐,我火速辦了婚禮,結(jié)果婚禮上书释,老公的妹妹穿的比我還像新娘翘贮。我一直安慰自己,他們只是感情好爆惧,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布狸页。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芍耘。 梳的紋絲不亂的頭發(fā)上址遇,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音斋竞,去河邊找鬼倔约。 笑死,一個(gè)胖子當(dāng)著我的面吹牛坝初,可吹牛的內(nèi)容都是我干的浸剩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鳄袍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼绢要!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起畦木,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤袖扛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后十籍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蛆封,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年勾栗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惨篱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡围俘,死狀恐怖砸讳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情界牡,我是刑警寧澤簿寂,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站宿亡,受9級(jí)特大地震影響常遂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挽荠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一克胳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧圈匆,春花似錦漠另、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春砚作,著一層夾襖步出監(jiān)牢的瞬間窘奏,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工葫录, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留着裹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓米同,卻偏偏與公主長(zhǎng)得像骇扇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子面粮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • JS分片上傳 //分片上傳 function ScarecrowPatchUpload (uploadPath, ...
    隱形的稻草人_44ca閱讀 1,055評(píng)論 0 1
  • 本文參加又拍云原創(chuàng)技術(shù)征文活動(dòng) 注冊(cè)&實(shí)名認(rèn)證 注冊(cè)我就不說(shuō)了少孝,大家自行前往又拍云注冊(cè)就行。 注冊(cè)之后需要實(shí)名認(rèn)證...
    Willis1閱讀 533評(píng)論 0 0
  • 久違的晴天熬苍,家長(zhǎng)會(huì)稍走。 家長(zhǎng)大會(huì)開(kāi)好到教室時(shí),離放學(xué)已經(jīng)沒(méi)多少時(shí)間了柴底。班主任說(shuō)已經(jīng)安排了三個(gè)家長(zhǎng)分享經(jīng)驗(yàn)婿脸。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,496評(píng)論 16 22
  • 創(chuàng)業(yè)是很多人的夢(mèng)想,多少人為了理想和不甘選擇了創(chuàng)業(yè)來(lái)實(shí)現(xiàn)自我價(jià)值柄驻,我就是其中一個(gè)狐树。 創(chuàng)業(yè)后,我由女人變成了超人鸿脓,什...
    亦寶寶閱讀 1,802評(píng)論 4 1
  • 今天感恩節(jié)哎抑钟,感謝一直在我身邊的親朋好友。感恩相遇野哭!感恩不離不棄在塔。 中午開(kāi)了第一次的黨會(huì),身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,551評(píng)論 0 11