php 로 큰 파일 분할 업로드 문 제 를 어떻게 해결 합 니까?
6055 단어 PHP편 을 나 누 어 업로드 하 다.큰 문서
전제 조건
우선,엄 청 난 파일 을 업로드 합 니 다.전단 은 백 엔 드 와 서로 협조 하여 파일 을 업로드 하려 면 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 초 밖 에 걸 리 지 않 았 습 니 다.서버 에서 테스트 한 적 이 없 으 니 이 방법 에 따라 해 보 세 요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.