php 로 큰 파일 분할 업로드 문 제 를 어떻게 해결 합 니까?

올 린 파일 이 10m 이하 라면 이런 방법 을 고려 할 필요 가 없습니다.php.ini 에서 upload 를 변경 하 세 요.max_filesize = 10m post_max_size=10m 이렇게 하면 됩 니 다.phop 이 엄 청 난 파일 을 올 렸 다 고 말씀 드 리 겠 습 니 다.
전제 조건
우선,엄 청 난 파일 을 업로드 합 니 다.전단 은 백 엔 드 와 서로 협조 하여 파일 을 업로드 하려 면 ajax 방법 을 사용 해 야 합 니 다.form 의 submit 방식 이 아 닙 니 다.
사상
전단 은 file 파일 대상 을 일정한 크기 로 나 누 어 일정한 크기 의 파일(예 를 들 어 2M 또는 5M 으로 분할)로 나 누 어 분 단 된 파일 을 백 엔 드 에 하나씩 올 리 고 백 엔 드 는 분 편 파일 을 받 은 후 임시 디 렉 터 리 에 먼저 놓 고 전단 에서 완 료 된 데이터 요청 을 받 았 을 때 임시 디 렉 터 리 에 있 는 파일 을 새 파일 로 조립 합 니 다.저장 후 임시 디 렉 터 리 에 있 는 파일 을 삭제 하면 됩 니 다.
코드
html

<div class="a">
            <input id="myfile" type="file" name="myfile"/>
   </div>
여기 설명 할 게 요.submit 로 올 리 지 않 았 어 요.ajax 로 올 렸 어 요.
javascript

<script>
	$(function(){
		let myfile = document.getElementById("myfile");
		myfile.onchange = function(){
			let file = myfile.files[0];		//             
			let length = 1024 * 1024 * 5;   //           
			let total_number = Math.ceil(file.size/length) //     ,         
			let start = 0;			//       
			let end = length;		//       
			let parr = [];         //   promise.all        ;
			for(let i = 1;i<=total_number;i++){
				//      ,               
				let bolb = file.slice(start,end);  //      
				start = end;				//            
				end = start+length;			//            
				if(end > file.size){
					end=file.size;		//                  
				}
				let formdata = new FormData();  //    FormData  ,       
				formdata.append("file",blob);   //        formdata
				formdata.append("tempfilename",i+"_"+file.name)  //             ,     i             
				
				//formdata     ,    pro()   ,     promise  ,       parr    ,       promise.all    
				parr.push(pro(formadata));
			}
			//  for       ,  parr               promise    ,       promise.all   ,             ,            ,        ,            
			Promise.all(parr).then(res=>{
				if(res.length == parr.length){   //              parr       ,          
					//             ,             ,                ,               ,         flag=1               
 $.ajax({
                    type:"post",
                    url:"http://fastadmin.test/index/upload/getupload",
                    data:{flag:1,filename:file.name},  //   flag=1      ,    , filename:            
                    success:function(res){
                        if(res.length == parr.length){
                            console.log(111);
                        }
                    },
                    fail: function () {
                        reject()
                    }
                })
				}
			})
		}
	})
	//            ,        promise   ,         promise.all               
	//       , $.post()          ,    $.ajax()      contentType:false processData:false   
    function pro(formData){
        return new Promise((resolve,reject)=>{
            $.ajax({
                type:"post",
                url:"http://fastadmin.test/index/upload/getupload",  //         
                data:formData,
                contentType: false,    //     , ajax         
                processData: false,	   //     , ajax       false
                success:function(res){
                    resolve(res)
                },
                fail: function () {
                    reject()
                }
            })
        })
    }		
</script>
이상 이 바로 전단 의 js 핵심 부분 입 니 다.주석 은 기본적으로 이해 할 수 있 습 니 다.
php
사용 하 는 tp5 프레임 워 크

public function getUpload(){
	$tempdir = APP_PATH."../public/tempdir"; //                ,      
	$flag = input("flag",0);//    flag             0,   flag=1,       
	if($flag == 0){
		//       
		$file = request()->file("file");  //       
		$tempfilename = input("tempfilename");  //          , (  ,           )
		if(!file_exists($tempdir)){
			mkdir($tempdir,0755,true);		//         ,         
		}
		$fileinfo = $file->move($tempdir,$tmpfilename);
		if($fileinfo){  //                  ,          ,                 
			return josn(['error'=>0])
		}else{
			return json(['error'=>1])
		}
	}else if($flag == 1){
		//  flag   1   ,         
		$filename = input("filename");
		//           ,        ,            
		$fileArr = glob($tempdir."/*".$filename);
		//     *       ,                 $filename      
		//    , $fileArr               ,                   
		$newfileArr = [];
		foreach($fileArr as $f){
		// js                 +"_",              ,                 key  
			$filebasename = basename($f); //$f        ,      basename      
			$filebasenamesplit = explode("_",$filebasename); //           , 
			$newfileArr[$filebasenamesplit[0]] = $f;    //         ,       key       ,               
		}
		//             ,       
		$num = count($newfileArr);  //          ,      for      
		//    for      
		$newfilename = "huangjunhui".$filename; //              ,    
		for($i = 1;$i<=$num;$i++){
			file_put_contents($newfilename,file_get_contents($newfileArr[$i]),FILE_APPEND);
			//        ,                , 
		}
		......
		//            ,        try catch        
		foreach($newfileArr as $fi){
			unlink($fi);
		}
		//                 
	}
}
위의 방법 은 제 가 로 컬 테스트 에서 650 M 의 파일 을 올 렸 는데 20 초 밖 에 걸 리 지 않 았 습 니 다.서버 에서 테스트 한 적 이 없 으 니 이 방법 에 따라 해 보 세 요.

좋은 웹페이지 즐겨찾기