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

前端技术 2023/09/03 PHP

最近研究了下大文件上传的方法,找到了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\", \"rb\")) {
        die(\'{\"jsonrpc\" : \"2.0\", \"error\" : {\"code\": 101, \"message\": \"Failed to open input stream.\"}, \"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\": \"Failed to open output stream.\"}, \"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\"}\');

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

本文地址:https://www.stayed.cn/item/6780

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。