實(shí)現(xiàn)大文件上傳的辦法

方法一

對(duì)php.ini進(jìn)行修改

file_uploads = on; //是否允許通過(guò)http上傳文件的開(kāi)關(guān)(默認(rèn)為開(kāi))

upload_max_filesize = 8m // PHP允許最大上傳文件大小

post_max_size = 8m; //表單post提交允許最大上傳文件大小

max_execution_time = 30; // php頁(yè)面運(yùn)行最大時(shí)間(默認(rèn)30s)

max_input_time = 60; // php頁(yè)面接收數(shù)據(jù)允許最大時(shí)間(默認(rèn)60s)

內(nèi)存限制= 8m; // php占用最大內(nèi)存(默認(rèn)8m)

方法二

實(shí)現(xiàn)大文件斷點(diǎn)續(xù)傳

思路:

將大文件看成是由多個(gè)小文件組成的(從1kb到500kb為1文件阅茶,從501kb到1000kb為2文件,以此類推;利用javascript函數(shù)slice()完成)
將這些小文件在后臺(tái)組合成一個(gè)大文件(利用php函數(shù))

引入代碼

html+javascript:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>斷點(diǎn)續(xù)傳</title>
</head>
<body>
<div id="drop_area" style="border:3px dashed silver;width:200px; height:200px">
將圖片拖拽到此
</div>

    <progress value="0" max="10" id="prouploadfile"></progress>  
      
    <span id="persent">0%</span>  
    <br />  
    <!--<button onclick="xhr2()">ajax上傳</button>-->     
    <button onclick="stopup()" id="stop">上傳</button>      
    <script>  
    //拖拽上傳開(kāi)始  
    //-1.禁止瀏覽器打開(kāi)文件行為  
    document.addEventListener("drop",function(e){  //拖離   
        e.preventDefault();      
    })  
    document.addEventListener("dragleave",function(e){  //拖后放   
        e.preventDefault();      
    })  
    document.addEventListener("dragenter",function(e){  //拖進(jìn)  
        e.preventDefault();      
    })  
    document.addEventListener("dragover",function(e){  //拖來(lái)拖去    
        e.preventDefault();      
    })  
    //上傳進(jìn)度  
    var pro = document.getElementById('prouploadfile');  
    var persent = document.getElementById('persent');  
    function clearpro(){  
        pro.value=0;  
        persent.innerHTML="0%";  
    }  
      
    //2.拖拽  
    var stopbutton = document.getElementById('stop');  
      
    var resultfile=""  
    var box = document.getElementById('drop_area'); //拖拽區(qū)域     
    box.addEventListener("drop",function(e){           
        var fileList = e.dataTransfer.files; //獲取文件對(duì)象    
        console.log(fileList)  
        //檢測(cè)是否是拖拽文件到頁(yè)面的操作            
        if(fileList.length == 0){                
            return false;            
        }             
        //拖拉圖片到瀏覽器,可以實(shí)現(xiàn)預(yù)覽功能    
        //規(guī)定視頻格式  
        //in_array  
        Array.prototype.S=String.fromCharCode(2);  
        Array.prototype.in_array=function(e){  
            var r=new RegExp(this.S+e+this.S);  
            return (r.test(this.S+this.join(this.S)+this.S));  
        };  
        var video_type=["video/mp4","video/ogg"];  
          
        //創(chuàng)建一個(gè)url連接,供src屬性引用  
        var fileurl = window.URL.createObjectURL(fileList[0]);                
        if(fileList[0].type.indexOf('image') === 0){  //如果是圖片  
            var str="![]("+fileurl+")";  
            document.getElementById('drop_area').innerHTML=str;                   
        }else if(video_type.in_array(fileList[0].type)){   //如果是規(guī)定格式內(nèi)的視頻                    
            var str="<video width='200px' height='200px' controls='controls' src='"+fileurl+"'></video>";  
            document.getElementById('drop_area').innerHTML=str;        
        }else{ //其他格式桌吃,輸出文件名  
            //alert("不預(yù)覽");  
            var str="文件名字:"+fileList[0].name;  
            document.getElementById('drop_area').innerHTML=str;      
        }         
        resultfile = fileList[0];     
        console.log(resultfile);      
          
        //切片計(jì)算  
        filesize= resultfile.size;  
        setsize=500*1024;  
        filecount = filesize/setsize;  
        //console.log(filecount)  
        //定義進(jìn)度條  
        pro.max=parseInt(Math.ceil(filecount));   
          
          
          
        i =getCookie(resultfile.name);  
        i = (i!=null && i!="")?parseInt(i):0  
          
        if(Math.floor(filecount)<i){  
            alert("已經(jīng)完成");  
            pro.value=i+1;  
            persent.innerHTML="100%";  
          
        }else{  
            alert(i);  
            pro.value=i;  
            p=parseInt(i)*100/Math.ceil(filecount)  
            persent.innerHTML=parseInt(p)+"%";  
        }  
          
    },false);    
      
    //3.ajax上傳  

    var stop=1;  
    function xhr2(){  
        if(stop==1){  
            return false;  
        }  
        if(resultfile==""){  
            alert("請(qǐng)選擇文件")  
            return false;  
        }  
        i=getCookie(resultfile.name);  
        console.log(i)  
        i = (i!=null && i!="")?parseInt(i):0  
          
        if(Math.floor(filecount)<parseInt(i)){  
            alert("已經(jīng)完成");  
            return false;  
        }else{  
            //alert(i)  
        }  
        var xhr = new XMLHttpRequest();//第一步  
        //新建一個(gè)FormData對(duì)象  
        var formData = new FormData(); //++++++++++  
        //追加文件數(shù)據(jù)  
          
        //改變進(jìn)度條  
        pro.value=i+1;  
        p=parseInt(i+1)*100/Math.ceil(filecount)  
        persent.innerHTML=parseInt(p)+"%";  
        //進(jìn)度條  
          
          
        if((filesize-i*setsize)>setsize){  
            blobfile= resultfile.slice(i*setsize,(i+1)*setsize);  
        }else{  
            blobfile= resultfile.slice(i*setsize,filesize);  
            formData.append('lastone', Math.floor(filecount));  
        }  
            formData.append('file', blobfile);  
            //return false;  
            formData.append('blobname', i); //++++++++++  
        formData.append('filename', resultfile.name); //++++++++++  
            //post方式  
            xhr.open('POST', 'duandian.php'); //第二步驟  
            //發(fā)送請(qǐng)求  
            xhr.send(formData);  //第三步驟  
            stopbutton.innerHTML = "暫停"  
            //ajax返回  
            xhr.onreadystatechange = function(){ //第四步  
            if ( xhr.readyState == 4 && xhr.status == 200 ) {  
              console.log( xhr.responseText );  
                    if(i<filecount){  
                        xhr2();  
                    }else{  
                        i=0;  
                    }         
            }  
          };  
            //設(shè)置超時(shí)時(shí)間  
            xhr.timeout = 20000;  
            xhr.ontimeout = function(event){  
            alert('請(qǐng)求超時(shí),網(wǎng)絡(luò)擁堵培廓!低于25K/s');  
          }           
              
            i=i+1;  
            setCookie(resultfile.name,i,365)  
              
    }  
      
    //設(shè)置cookie  
    function setCookie(c_name,value,expiredays)  
    {  
        var exdate=new Date()  
        exdate.setDate(exdate.getDate()+expiredays)  
        document.cookie=c_name+ "=" +escape(value)+  
        ((expiredays==null) ? "" : ";expires="+exdate.toGMTString()+";path=/")  
    }  
    //獲取cookie  
    function getCookie(c_name)  
    {  
    if (document.cookie.length>0)  
      {  
      c_start=document.cookie.indexOf(c_name + "=")  
      if (c_start!=-1)  
        {   
        c_start=c_start + c_name.length+1   
        c_end=document.cookie.indexOf(";",c_start)  
        if (c_end==-1) c_end=document.cookie.length  
        return unescape(document.cookie.substring(c_start,c_end))  
        }   
      }  
    return ""  
    }  
      
      
    function stopup(){  
        if(stop==1){  
            stop = 0  
              
            xhr2();  
        }else{  
            stop = 1  
            stopbutton.innerHTML = "繼續(xù)"  
              
        }  
          
    }  
    </script>  
</body>  

</html>

php:

<?php
//$name=$_POST['username'];
$dir=$_POST['filename'];
$dir="uploads/".md5($dir);
file_exists($dir) or mkdir($dir,0777,true);

$path=$dir."/".$_POST['blobname'];

//print_r($_FILES["file"]);
move_uploaded_file($_FILES["file"]["tmp_name"],$path);

if(isset($_POST['lastone'])){
echo $_POST['lastone'];
$count=$_POST['lastone'];

$fp   = fopen($_POST['filename'],"abw");  
for($i=0;$i<=$count;$i++){  
    $handle = fopen($dir."/".$i,"rb");    
    fwrite($fp,fread($handle,filesize($dir."/".$i)));    
    fclose($handle);      
}  
fclose($fp);  

}

?>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末此衅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子悉患,更是在濱河造成了極大的恐慌残家,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件售躁,死亡現(xiàn)場(chǎng)離奇詭異坞淮,居然都是意外死亡茴晋,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門回窘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)诺擅,“玉大人,你說(shuō)我怎么就攤上這事啡直∷赣浚” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵酒觅,是天一觀的道長(zhǎng)撮执。 經(jīng)常有香客問(wèn)我,道長(zhǎng)舷丹,這世上最難降的妖魔是什么抒钱? 我笑而不...
    開(kāi)封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮颜凯,結(jié)果婚禮上继效,老公的妹妹穿的比我還像新娘。我一直安慰自己装获,他們只是感情好瑞信,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著穴豫,像睡著了一般凡简。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上精肃,一...
    開(kāi)封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天秤涩,我揣著相機(jī)與錄音,去河邊找鬼司抱。 笑死筐眷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的习柠。 我是一名探鬼主播匀谣,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼资溃!你這毒婦竟也來(lái)了武翎?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤溶锭,失蹤者是張志新(化名)和其女友劉穎宝恶,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡垫毙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年霹疫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片综芥。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡更米,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毫痕,到底是詐尸還是另有隱情征峦,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布消请,位于F島的核電站栏笆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏臊泰。R本人自食惡果不足惜蛉加,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缸逃。 院中可真熱鬧针饥,春花似錦、人聲如沸需频。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)昭殉。三九已至苞七,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挪丢,已是汗流浹背蹂风。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乾蓬,地道東北人惠啄。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像任内,于是被迫代替她去往敵國(guó)和親撵渡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 《ijs》速成開(kāi)發(fā)手冊(cè)3.0 官方用戶交流:iApp開(kāi)發(fā)交流(1) 239547050iApp開(kāi)發(fā)交流(2) 10...
    葉染柒丶閱讀 5,194評(píng)論 0 7
  • 《ilua》速成開(kāi)發(fā)手冊(cè)3.0 官方用戶交流:iApp開(kāi)發(fā)交流(1) 239547050iApp開(kāi)發(fā)交流(2) 1...
    葉染柒丶閱讀 10,797評(píng)論 0 11
  • H5 meta詳解 viewport width:控制 viewport 的大小族奢,可以指定的一個(gè)值姥闭,如果 600丹鸿,...
    FConfidence閱讀 823評(píng)論 0 3
  • 個(gè)人博客:https://yeaseonzhang.github.io 花了半個(gè)多月的時(shí)間越走,終于又把“JS紅寶書”...
    Yeaseon閱讀 1,755評(píng)論 2 23
  • Dv先生是諾貝爾的第四十五代子孫,他曾經(jīng)發(fā)明出時(shí)光機(jī)。不過(guò)差點(diǎn)弄壞了廊敌。 Dv先生今年6歲了铜跑,他和我是一對(duì)...
    薛徳欣閱讀 303評(píng)論 0 0