
2020.12.29
1808
随着互联网的迅猛发展和广泛应用,越来越多的用户在操作图片上传、文件上传时会选择大文件。按以前将一个文件整体FORM上传到服务端,已不在适用。
	        随着互联网的迅猛发展和广泛应用,越来越多的用户在操作图片上传、文件上传时会选择大文件。按以前将一个文件整体FORM上传到服务端,已不在适用。
这时我们需要将一个大文件按一定大小,在客户端(浏览器)切割,然后再在服务端整合这些文件内容块。这样我们就能将一个大文件较快上传到服务端了,或者 在说也不遇到大文件无法上传问题。
      这里我们使用PHP+WebUploader简单实现一个分块上传,首先我们实现客户端(浏览器):
     var uploader;
     // 初始化Web Uploader
     uploader = WebUploader.create({
         // 自动上传。
         auto: true,
         // swf文件路径
         swf: '/template/default/js/newajaxupload/Uploader.swf',
         // 文件接收服务端。
         server: uploadserverurl,
         // 选择文件的按钮。可选。
         // 内部根据当前运行是创建,可能是input元素,也可能是flash.
         pick: {
             id: '{$pickid}',
             innerHTML: '上传本地附件',
             multiple:true
         },
 sendAsBinary:true,
 duplicate:true,
 compress:false,
 chunked: true, //开启分块上传
            chunkSize: 5 * 1024 * 1024,//5M 一个分片
            chunkRetry: 3, //网络问题上传失败后重试次数
            threads: 1, //上传并发数
     });
	     //进度...
     uploader.on('uploadProgress',function(file,percentage){
 
 var proges = percentage * 100;
     proges -= 10;
 $('.progssfile'+file.id).css( 'width', proges + '%' );
 
 });
 uploader.on('error', function( type ){
 if ( type === 'Q_EXCEED_NUM_LIMIT' ) {
 //alert('一次性最多允许上传9张图片!');
 //return false;
 }
 $('{$pickid}_pro').html('选择上传文件失败!大小,格式是否正确!!');
 $('.progessbar'+file.id).remove();
 });
 //最终完成...
 uploader.on('uploadSuccess',function(file, response){
 
 //console.log(file)
});
	 //询问是本次请求否上传成功
 uploader.on( 'uploadAccept', function( file, response ) {
 console.log(response);
 fnamek = response.fnamek
 });
 
 //某次上传前...
     uploader.on('uploadBeforeSend', function (obj, data, headers) {
        console.log(obj);
 });
	
在服务端:
	//文件
$fnamek= uniqid();
//分块上传同一文件标识..
$iptfnamek = empty($_GET['fnamek']) ? '' : trim(htmlspecialchars($_GET['fnamek']));
if(!empty($iptfnamek)){
 //追加分块上传...
 $fnamek = $iptfnamek;
}
$fname = $fnamek.'.'.$file['fileext'];
$fpn = $dirPath.$fname;
$filePath = $fpn.'.'.$file['fileext'];
$filethumbPath = $fpn.'_thumb.'.$file['fileext'];
if(file_exists($filePath)){
 //存在就追加...
 file_put_contents($filePath, file_get_contents("php://input"),FILE_APPEND);
}else{
 file_put_contents($filePath, file_get_contents("php://input"));
}
最主要在于 文件名要保持同一个,这样才能追加操作,最后形成一个文件。
	
当然以为代码比较粗糙,有兴趣同学可看看七牛的分块上传。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

028-86040068
  联系我们
                
