php结合web uploader插件实现分片上传文件
最近研究了下大文件上传的方法,找到了webuploaderjs插件进行大文件上传,大家也可以参考这篇文章进行学习:《WebUploader文件上传插件使用详解》
使用
使用webuploader分成简单直选要引入
<!--引入CSS--> <linkrel="stylesheet"type="text/css"href="webuploader文件夹/webuploader.css"> <!--引入JS--> <scripttype="text/javascript"src="webuploader文件夹/webuploader.js"></script>
HTML部分
<divid="uploader"class="wu-example"> <!--用来存放文件信息--> <divid="thelist"class="uploader-list"></div> <divclass="btns"> <divid="picker">选择文件</div> <buttonid="ctlBtn"class="btnbtn-default">开始上传</button> </div> </div>
初始化WebUploader
jQuery(function(){
$list=$('#thelist'),
$btn=$('#ctlBtn'),
state='pending',
uploader;
uploader=WebUploader.create({
//不压缩image
resize:false,
//swf文件路径
swf:'uploader.swf',
//文件接收服务端。
server:upload.php,
//选择文件的按钮。可选。
//内部根据当前运行是创建,可能是input元素,也可能是flash.
pick:'#picker',
chunked:true,
chunkSize:2*1024*1024,
auto:true,
accept:{
title:'Images',
extensions:'gif,jpg,jpeg,bmp,png',
mimeTypes:'image/*'
}
});
upload.php处理
以下是根据别人的例子自己拿来改的php后台代码
header("Expires:Mon,26Jul199705:00:00GMT");
header("Last-Modified:".gmdate("D,dMYH:i:s")."GMT");
header("Cache-Control:no-store,no-cache,must-revalidate");
header("Cache-Control:post-check=0,pre-check=0",false);
header("Pragma:no-cache");
if($_SERVER['REQUEST_METHOD']=='OPTIONS'){
exit;//finishpreflightCORSrequestshere
}
if(!empty($_REQUEST['debug'])){
$random=rand(0,intval($_REQUEST['debug']));
if($random===0){
header("HTTP/1.0500InternalServerError");
exit;
}
}
//header("HTTP/1.0500InternalServerError");
//exit;
//5minutesexecutiontime
@set_time_limit(5*60);
//Uncommentthisonetofakeuploadtime
//usleep(5000);
//Settings
//$targetDir=ini_get("upload_tmp_dir").DIRECTORY_SEPARATOR."plupload";
$targetDir='uploads'.DIRECTORY_SEPARATOR.'file_material_tmp';
$uploadDir='uploads'.DIRECTORY_SEPARATOR.'file_material';
$cleanupTargetDir=true;//Removeoldfiles
$maxFileAge=5*3600;//Tempfileageinseconds
//Createtargetdir
if(!file_exists($targetDir)){
@mkdir($targetDir);
}
//Createtargetdir
if(!file_exists($uploadDir)){
@mkdir($uploadDir);
}
//Getafilename
if(isset($_REQUEST["name"])){
$fileName=$_REQUEST["name"];
}elseif(!empty($_FILES)){
$fileName=$_FILES["file"]["name"];
}else{
$fileName=uniqid("file_");
}
$oldName=$fileName;
$filePath=$targetDir.DIRECTORY_SEPARATOR.$fileName;
//$uploadPath=$uploadDir.DIRECTORY_SEPARATOR.$fileName;
//Chunkingmightbeenabled
$chunk=isset($_REQUEST["chunk"])?intval($_REQUEST["chunk"]):0;
$chunks=isset($_REQUEST["chunks"])?intval($_REQUEST["chunks"]):1;
//Removeoldtempfiles
if($cleanupTargetDir){
if(!is_dir($targetDir)||!$dir=opendir($targetDir)){
die('{"jsonrpc":"2.0","error":{"code":100,"message":"Failedtoopentempdirectory."},"id":"id"}');
}
while(($file=readdir($dir))!==false){
$tmpfilePath=$targetDir.DIRECTORY_SEPARATOR.$file;
//Iftempfileiscurrentfileproceedtothenext
if($tmpfilePath=="{$filePath}_{$chunk}.part"||$tmpfilePath=="{$filePath}_{$chunk}.parttmp"){
continue;
}
//Removetempfileifitisolderthanthemaxageandisnotthecurrentfile
if(preg_match('/\.(part|parttmp)$/',$file)&&(@filemtime($tmpfilePath)<time()-$maxFileAge)){
@unlink($tmpfilePath);
}
}
closedir($dir);
}
//Opentempfile
if(!$out=@fopen("{$filePath}_{$chunk}.parttmp","wb")){
die('{"jsonrpc":"2.0","error":{"code":102,"message":"Failedtoopenoutputstream."},"id":"id"}');
}
if(!empty($_FILES)){
if($_FILES["file"]["error"]||!is_uploaded_file($_FILES["file"]["tmp_name"])){
die('{"jsonrpc":"2.0","error":{"code":103,"message":"Failedtomoveuploadedfile."},"id":"id"}');
}
//Readbinaryinputstreamandappendittotempfile
if(!$in=@fopen($_FILES["file"]["tmp_name"],"rb")){
die('{"jsonrpc":"2.0","error":{"code":101,"message":"Failedtoopeninputstream."},"id":"id"}');
}
}else{
if(!$in=@fopen("php://input","rb")){
die('{"jsonrpc":"2.0","error":{"code":101,"message":"Failedtoopeninputstream."},"id":"id"}');
}
}
while($buff=fread($in,4096)){
fwrite($out,$buff);
}
@fclose($out);
@fclose($in);
rename("{$filePath}_{$chunk}.parttmp","{$filePath}_{$chunk}.part");
$index=0;
$done=true;
for($index=0;$index<$chunks;$index++){
if(!file_exists("{$filePath}_{$index}.part")){
$done=false;
break;
}
}
if($done){
$pathInfo=pathinfo($fileName);
$hashStr=substr(md5($pathInfo['basename']),8,16);
$hashName=time().$hashStr.'.'.$pathInfo['extension'];
$uploadPath=$uploadDir.DIRECTORY_SEPARATOR.$hashName;
if(!$out=@fopen($uploadPath,"wb")){
die('{"jsonrpc":"2.0","error":{"code":102,"message":"Failedtoopenoutputstream."},"id":"id"}');
}
if(flock($out,LOCK_EX)){
for($index=0;$index<$chunks;$index++){
if(!$in=@fopen("{$filePath}_{$index}.part","rb")){
break;
}
while($buff=fread($in,4096)){
fwrite($out,$buff);
}
@fclose($in);
@unlink("{$filePath}_{$index}.part");
}
flock($out,LOCK_UN);
}
@fclose($out);
$response=[
'success'=>true,
'oldName'=>$oldName,
'filePaht'=>$uploadPath,
'fileSize'=>$data['size'],
'fileSuffixes'=>$pathInfo['extension'],
'file_id'=>$data['id'],
];
die(json_encode($response));
}
//ReturnSuccessJSON-RPCresponse
die('{"jsonrpc":"2.0","result":null,"id":"id"}');
更多关于PHP文件上传的精彩内容请关注专题《PHP文件上传操作汇总》,希望对大家有帮助。
以上就是本文的全部内容,希望对大家的学习有所帮助。