首页 Linux LINUX教程:php结合web uploader插件实现分片上传文件

LINUX教程:php结合web uploader插件实现分片上传文件

介绍《LINUX教程:php结合web uploader插件实现分片上传文件》开发教程,希望对您有用。

《LINUX教程:php结合web uploader插件实现分片上传文件》要点:
本文介绍了LINUX教程:php结合web uploader插件实现分片上传文件,希望对您有用。如果有疑问,可以联系我们。

最近研究了下大文件上传的办法,找到了webuploader js 插件进行大文件上传,大家也可以参考这篇文章进行学习:《Web Uploader文件上传插件使用详解》

使用

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

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

HTML部分

<div id="uploader" class="wu-example">
 <!--用来存放文件信息-->
 <div id="thelist" class="uploader-list"></div>
 <div class="btns">
  <div id="picker">选择文件</div>
  <button id="ctlBtn" class="btn btn-default">开始上传   </button>
 </div>
 </div>

初始化Web Uploader

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,26 Jul 1997 05:00:00 GMT");
  header("Last-Modified: " . gmdate("D,d M Y H: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; // 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 = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload";
  $targetDir = 'uploads'.DIRECTORY_SEPARATOR.'file_material_tmp';
  $uploadDir = 'uploads'.DIRECTORY_SEPARATOR.'file_material';
  $cleanupTargetDir = true; // Remove old files
  $maxFileAge = 5 * 3600; // Temp file age in seconds
  // Create target dir
  if (!file_exists($targetDir)) {
   @mkdir($targetDir);
  }
  // Create target dir
  if (!file_exists($uploadDir)) {
   @mkdir($uploadDir);
  }
  // Get a file name
  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;
  // 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 directory."},"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);
  }
  // Open temp file
  if (!$out = @fopen("{$filePath}_{$chunk}.parttmp","wb")) {
   die('{"jsonrpc" : "2.0","error" : {"code": 102,"message": "Failed to open output stream."},"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 file."},"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 stream."},"id" : "id"}');
   }
  } else {
   if (!$in = @fopen("php://input","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","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));
  }
  // Return Success JSON-RPC response
  die('{"jsonrpc" : "2.0","result" : null,"id" : "id"}');

更多关于PHP文件上传的精彩内容请关注专题《PHP文件上传操作汇总》,希望对大家有赞助.

以上就是本文的全部内容,希望对大家的学习有所赞助.

本文来自网络,不代表云浮站长网立场。转载请注明出处: https://www.0766zz.com/html/zhonghe/fwq/linux/20200901/9364.html
上一篇
下一篇

作者: dawei

【声明】:云浮站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

为您推荐

返回顶部