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文件上传操作汇总》,希望对大家有帮助。
以上就是本文的全部内容,希望对大家的学习有所帮助。