thinkphp5使⽤webuploader切⽚进⾏⼤⽂件上传,1g⼤⽂件只需⼗⼏秒即可上
传完成
资源引⼊
<script type="text/javascript" charset="UTF-8" src="/static/js/jquery-3.1.1.min.js"></script>
<link rel="stylesheet" type="text/css" href="/static/webuploader/webuploader.css"/>
<link rel="stylesheet" type="text/css" href="/static/webuploader/webuploader-style.css"/>
<script type="text/javascript" charset="UTF-8" src="/static/webuploader/webuploader.js"></script>
html代码
<div class="demo">
<div id="uploadfile">
<!--⽤来存放⽂件信息-->
<div id="the_2655"class="uploader-list"></div>
<div class="form-group form-inline">
<div id="pick_2655" >选择⽂件</div>
<button id="Btn_2655"class="btn btn-default" >开始上传</button>
</div>
</div>
</div>
js代码,封装好的⽅法uploadfiles,直接使⽤uploadfiles(2655,‘files’)调⽤
uploadfiles(2655,'files');
//上传⽂件函数
blogs//ids唯⼀ID
//folder⽂件保存⽬录
function uploadfiles(ids,folder){
$(function(){
var$list= $("#the_"+ids);
$btn= $("#Btn_"+ids);
var uploader = ate({
resize:false,// 不压缩image
swf:'/static/webuploader/Uploader.swf',// swf⽂件路径
server:'{:url("uploadFile")}',// ⽂件接收服务端。
pick:"#pick_"+ids,// 选择⽂件的按钮。可选
chunked:true,//是否要分⽚处理⼤⽂件上传
chunkSize:5*1024*1024,//分⽚上传,每⽚2M,默认是5M
//fileSizeLimit: 6*1024* 1024 * 1024, // 所有⽂件总⼤⼩限制 6G
fileSingleSizeLimit:10*1024*1024*1024,// 单个⽂件⼤⼩限制 5 G
formData:{
folder:folder //⾃定义参数
}
//auto: false //选择⽂件后是否⾃动上传
// chunkRetry : 2, //如果某个分⽚由于⽹络问题出错,允许⾃动重传次数
//runtimeOrder: 'html5,flash',
// accept: {
// title: 'Images',
/
/ extensions: 'gif,jpg,jpeg,bmp,png',
// mimeTypes: 'image/*'
// }fostrap技术
});
// 当有⽂件被添加进队列的时候
<('fileQueued',function( file ){
$list.append('<div id="'+ file.id +'" class="item">'+
'<h4 class="info">'+ file.name +'</h4>'+
'<h4 class="info">'+ file.name +'</h4>'+
'<p class="state">等待上传...</p>'+
'</div>');
});
// ⽂件上传过程中创建进度条实时显⽰。
<('uploadProgress',function( file, percentage ){
var$li= $('#'+file.id ),
$percent=$li.find('.progress .progress-bar');
// 避免重复创建
if(!$percent.length ){
$percent= $('<div class="progress progress-striped active">'+
'<div class="progress-bar" role="progressbar" >'+
'</div>'+
'</div>').appendTo($li).find('.progress-bar');
}
$li.find('p.state').text('上传中');
$percent.css('width', percentage *100+'%');
});
// ⽂件上传成功
<('uploadSuccess',function( file,response){
$('#'+file.id ).find('p.state').text('已上传');
$list.append('<input type="hidden" name="'+ids+'" value="'+response.filePath+'" />');
//alert(response.filePath);
});
// ⽂件上传失败,显⽰上传出错
<('uploadError',function( file ){
$('#'+file.id ).find('p.state').text('上传出错');
});
// 完成上传完
<('uploadComplete',function( file ){
$('#'+file.id ).find('.progress').fadeOut();
});
$('click',function(){
if($(this).hasClass('disabled')){
return false;
}
uploader.upload();
// if (state === 'ready') {
// uploader.upload();
// } else if (state === 'paused') {
// uploader.upload();
// } else if (state === 'uploading') {
// uploader.stop();
// }
});
});
}
thinkphp控制器代码
/**
* 上传⽂件函数,如过上传不成功打印$_FILES数组,查看error报错信息
* 值:0; 没有错误发⽣,⽂件上传成功。
* 值:1; 上传的⽂件超过了 php.ini 中 upload_max_filesize 选项限制的值。
* 值:2; 上传⽂件的⼤⼩超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
* 值:3; ⽂件只有部分被上传。
* 值:4; 没有⽂件被上传。
*/
public function uploadFile(){
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Content-type: text/html; charset=gbk32");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0",false);
header("Pragma: no-cache");
$folder=input('folder');
if($_SERVER['REQUEST_METHOD']=='OPTIONS'){
exit;// finish preflight CORS requests here
}
if(!empty($_REQUEST['debug'])){
$random=rand(0,intval($_REQUEST['debug']));
if($random===0){
header("HTTP/1.0 500 Internal Server Error");
exit;
}
}
// header("HTTP/1.0 500 Internal Server Error");
// exit;
// 5 minutes execution time
set_time_limit(5*60);
// Uncomment this one to fake upload time
usleep(5000);
/
/ Settings
$targetDir='./Upload'.DIRECTORY_SEPARATOR.'file_material_tmp';//存放分⽚临时⽬录
if($folder){
$uploadDir='./Upload'.DIRECTORY_SEPARATOR.'file_material'.DIRECTORY_SEPARATOR.$folder.DIRECTORY_SEPARATOR.date('Ymd'); }else{
$uploadDir='./Upload'.DIRECTORY_SEPARATOR.'file_material'.DIRECTORY_SEPARATOR.date('Ymd');//分⽚合并存放⽬录
}
$cleanupTargetDir=true;// Remove old files
$maxFileAge=5*3600;// Temp file age in seconds
// Create target dir
if(!file_exists($targetDir)){
mkdir($targetDir,0777,true);
}
// Create target dir
if(!file_exists($uploadDir)){
mkdir($uploadDir,0777,true);
}
// Get a file name
if(isset($_REQUEST["name"])){
$fileName=$_REQUEST["name"];
}elseif(!empty($_FILES)){
$fileName=$_FILES["file"]["name"];
}else{
$fileName=uniqid("file_");
}
$oldName=$fileName;
$fileName=iconv('UTF-8','gb2312',$fileName);
$filePath=$targetDir.DIRECTORY_SEPARATOR.$fileName;
// $uploadPath = $uploadDir . DIRECTORY_SEPARATOR . $fileName;
// Chunking might be enabled
$chunk=isset($_REQUEST["chunk"])?intval($_REQUEST["chunk"]):0;
$chunks=isset($_REQUEST["chunks"])?intval($_REQUEST["chunks"]):1;
// Remove old temp files
if($cleanupTargetDir){
if(!is_dir($targetDir)||!$dir=opendir($targetDir)){
die('{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "Failed to open temp directory111."}, "id" : "id"}');
}
while(($file=readdir($dir))!==false){
$tmpfilePath=$targetDir.DIRECTORY_SEPARATOR.$file;
// If temp file is current file proceed to the next
if($tmpfilePath=="{$filePath}_{$chunk}.part"||$tmpfilePath=="{$filePath}_{$chunk}.parttmp"){
continue;
}
// Remove temp file if it is older than the max age and is not the current file
if(preg_match('/\.(part|parttmp)$/',$file)&&(filemtime($tmpfilePath)<time()-$maxFileAge)){
unlink($tmpfilePath);
}
}
closedir($dir);
javaconcat方法}
// Open temp file
if(!$out=fopen("{$filePath}_{$chunk}.parttmp","wb")){
die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream222."}, "id" : "id"}'); }
if(!empty($_FILES)){
if($_FILES["file"]["error"]||!is_uploaded_file($_FILES["file"]["tmp_name"])){
die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file333."}, "id" : "id"}'); }
// Read binary input stream and append it to temp file
if(!$in=fopen($_FILES["file"]["tmp_name"],"rb")){
die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream444."}, "id" : "id"}'); }
}else{
if(!$in=fopen("php://input","rb")){
die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream555."}, "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){
bat批处理命令批量改名$pathInfo=pathinfo($fileName);
$hashStr=substr(md5($pathInfo['basename']),8,16);
$hashName=time().$hashStr.'.'.$pathInfo['extension'];
$uploadPath=$uploadDir.DIRECTORY_SEPARATOR.$hashName;
jquery下载文件进度条if(!$out=fopen($uploadPath,"wb")){
die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream666."}, "id" : "id"}'); }
//flock($hander,LOCK_EX)⽂件锁
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,
'filePath'=>$uploadPath,
// 'fileSize'=>$data['size'],
'fileSuffixes'=>$pathInfo['extension'],//⽂件后缀名
// 'file_id'=>$data['id'],
];
return json($response);
}
// Return Success JSON-RPC response
die('{"jsonrpc" : "2.0", "result" : null, "id" : "id"}');
filechooser}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论