当前位置:首页 > PHP教程 > php上传下载 > 列表

php结合web uploader插件实现分片上传文件

发布:smiling 来源: PHP粉丝网  添加日期:2021-08-03 12:04:30 浏览: 评论:0 

这篇文章主要为大家详细介绍了php结合web uploader插件实现分片上传文件, 采用大文件分片并发上传,极大的提高了文件上传效率,感兴趣的小伙伴们可以参考一下,最近研究了下大文件上传的方法,找到了webuploader js 插件进行大文件上传,大家也可以参考这篇文章进行学习:《Web Uploader文件上传插件使用详解》

使用

使用webuploader分成简单直选要引入

  1. <!--引入CSS--> 
  2. <link rel="stylesheet" type="text/css" href="webuploader文件夹/webuploader.css"
  3.  
  4. <!--引入JS--> 
  5. <script type="text/javascript" src="webuploader文件夹/webuploader.js"></script> 

HTML部分

  1. <div id="uploader" class="wu-example"> 
  2.  <!--用来存放文件信息--> 
  3.  <div id="thelist" class="uploader-list"></div> 
  4.  <div class="btns"> 
  5.   <div id="picker">选择文件</div> 
  6.   <button id="ctlBtn" class="btn btn-default">开始上传   </button> 
  7.  </div> 
  8.  </div> 

初始化Web Uploader

  1. jQuery(function() { 
  2.   $list = $('#thelist'), 
  3.    $btn = $('#ctlBtn'), 
  4.    state = 'pending'
  5.    uploader; 
  6.  
  7.   uploader = WebUploader.create({ 
  8.    // 不压缩image 
  9.    resize: false
  10.    // swf文件路径 
  11.    swf: 'uploader.swf'
  12.    // 文件接收服务端。 
  13.    server: upload.php, 
  14.    // 选择文件的按钮。可选。 
  15.    // 内部根据当前运行是创建,可能是input元素,也可能是flash. 
  16.    pick: '#picker'
  17.    chunked: true
  18.    chunkSize:2*1024*1024, 
  19.    auto: true
  20.    accept: { 
  21.     title: 'Images'
  22.     extensions: 'gif,jpg,jpeg,bmp,png'
  23.     mimeTypes: 'image/*' 
  24.    } 
  25.   }); 

upload.php处理

以下是根据别人的例子自己拿来改的php 后台代码

  1. header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
  2.   header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
  3.   header("Cache-Control: no-store, no-cache, must-revalidate"); 
  4.   header("Cache-Control: post-check=0, pre-check=0", false); 
  5.   header("Pragma: no-cache"); 
  6.  
  7.   if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { 
  8.    exit// finish preflight CORS requests here 
  9.   } 
  10.   if ( !emptyempty($_REQUEST'debug' ]) ) { 
  11.    $random = rand(0, intval($_REQUEST'debug' ]) ); 
  12.    if ( $random === 0 ) { 
  13.     header("HTTP/1.0 500 Internal Server Error"); 
  14.     exit
  15.    } 
  16.   } 
  17.  
  18.   // header("HTTP/1.0 500 Internal Server Error"); 
  19.   // exit; 
  20.   // 5 minutes execution time 
  21.   @set_time_limit(5 * 60); 
  22.   // Uncomment this one to fake upload time 
  23.   // usleep(5000); 
  24.   // Settings 
  25.   // $targetDir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload"; 
  26.   $targetDir = 'uploads'.DIRECTORY_SEPARATOR.'file_material_tmp'
  27.   $uploadDir = 'uploads'.DIRECTORY_SEPARATOR.'file_material'
  28.   $cleanupTargetDir = true; // Remove old files 
  29.   $maxFileAge = 5 * 3600; // Temp file age in seconds 
  30.   // Create target dir 
  31.   if (!file_exists($targetDir)) { 
  32.    @mkdir($targetDir); 
  33.   } 
  34.   // Create target dir 
  35.   if (!file_exists($uploadDir)) { 
  36.    @mkdir($uploadDir); 
  37.   } 
  38.   // Get a file name 
  39.   if (isset($_REQUEST["name"])) { 
  40.    $fileName = $_REQUEST["name"]; 
  41.   } elseif (!emptyempty($_FILES)) { 
  42.    $fileName = $_FILES["file"]["name"]; 
  43.   } else { 
  44.    $fileName = uniqid("file_"); 
  45.   } 
  46.   $oldName = $fileName
  47.   $filePath = $targetDir . DIRECTORY_SEPARATOR . $fileName
  48.   // $uploadPath = $uploadDir . DIRECTORY_SEPARATOR . $fileName; 
  49.   // Chunking might be enabled 
  50.   $chunk = isset($_REQUEST["chunk"]) ? intval($_REQUEST["chunk"]) : 0; 
  51.   $chunks = isset($_REQUEST["chunks"]) ? intval($_REQUEST["chunks"]) : 1; 
  52.   // Remove old temp files 
  53.   if ($cleanupTargetDir) { 
  54.    if (!is_dir($targetDir) || !$dir = opendir($targetDir)) { 
  55.     die('{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "Failed to open temp directory."}, "id" : "id"}'); 
  56.    } 
  57.    while (($file = readdir($dir)) !== false) { 
  58.     $tmpfilePath = $targetDir . DIRECTORY_SEPARATOR . $file
  59.     // If temp file is current file proceed to the next 
  60.     if ($tmpfilePath == "{$filePath}_{$chunk}.part" || $tmpfilePath == "{$filePath}_{$chunk}.parttmp") { 
  61.      continue
  62.     } 
  63.     // Remove temp file if it is older than the max age and is not the current file 
  64.     if (preg_match('/\.(part|parttmp)$/'$file) && (@filemtime($tmpfilePath) < time() - $maxFileAge)) { 
  65.      @unlink($tmpfilePath); 
  66.     } 
  67.    } 
  68.    closedir($dir); 
  69.   } 
  70.  
  71.   // Open temp file 
  72.   if (!$out = @fopen("{$filePath}_{$chunk}.parttmp""wb")) { 
  73.    die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}'); 
  74.   } 
  75.   if (!emptyempty($_FILES)) { 
  76.    if ($_FILES["file"]["error"] || !is_uploaded_file($_FILES["file"]["tmp_name"])) { 
  77.     die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}'); 
  78.    } 
  79.    // Read binary input stream and append it to temp file 
  80.    if (!$in = @fopen($_FILES["file"]["tmp_name"], "rb")) { 
  81.     die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}'); 
  82.    } 
  83.   } else { 
  84.    if (!$in = @fopen("php://input""rb")) { 
  85.     die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}'); 
  86.    } 
  87.   } 
  88.   while ($buff = fread($in, 4096)) { 
  89.    fwrite($out$buff); 
  90.   } 
  91.   @fclose($out); 
  92.   @fclose($in); 
  93.   rename("{$filePath}_{$chunk}.parttmp""{$filePath}_{$chunk}.part"); 
  94.   $index = 0; 
  95.   $done = true; 
  96.   for$index = 0; $index < $chunks$index++ ) { 
  97.    if ( !file_exists("{$filePath}_{$index}.part") ) { 
  98.     $done = false; 
  99.     break
  100.    } 
  101.   } 
  102.  
  103.  
  104.  
  105.   if ( $done ) { 
  106.    $pathInfo = pathinfo($fileName); 
  107.    $hashStr = substr(md5($pathInfo['basename']),8,16); 
  108.    $hashName = time() . $hashStr . '.' .$pathInfo['extension']; 
  109.    $uploadPath = $uploadDir . DIRECTORY_SEPARATOR .$hashName
  110.  
  111.    if (!$out = @fopen($uploadPath"wb")) { 
  112.     die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}'); 
  113.    } 
  114.    if ( flock($out, LOCK_EX) ) { 
  115.     for$index = 0; $index < $chunks$index++ ) { 
  116.      if (!$in = @fopen("{$filePath}_{$index}.part""rb")) { 
  117.       break
  118.      } 
  119.      while ($buff = fread($in, 4096)) { 
  120.       fwrite($out$buff); 
  121.      } 
  122.      @fclose($in); 
  123.      @unlink("{$filePath}_{$index}.part"); 
  124.     } 
  125.     flock($out, LOCK_UN); 
  126.    } 
  127.    @fclose($out); 
  128.    $response = [ 
  129.     'success'=>true, 
  130.     'oldName'=>$oldName
  131.     'filePaht'=>$uploadPath
  132.     'fileSize'=>$data['size'], 
  133.     'fileSuffixes'=>$pathInfo['extension'], 
  134.     'file_id'=>$data['id'], 
  135.     ]; 
  136.  
  137.    die(json_encode($response)); 
  138.   } 
  139.  
  140.   // Return Success JSON-RPC response 
  141.   die('{"jsonrpc" : "2.0", "result" : null, "id" : "id"}');

Tags: php分片上传 uploader插件

分享到: