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


Posted in PHP onMay 10, 2016

最近研究了下大文件上传的方法,找到了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"}');

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

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

PHP 相关文章推荐
php学习之数据类型之间的转换介绍
Jun 09 PHP
ThinkPHP与PHPExcel冲突解决方法
Aug 08 PHP
Sorting Array Values in PHP(数组排序)
Sep 15 PHP
PHP实现的封装验证码类详解
Jun 18 PHP
解析PHP中数组元素升序、降序以及重新排序的函数
Jun 20 PHP
PHP实例分享判断客户端是否使用代理服务器及其匿名级别
Jun 04 PHP
9段PHP实用功能的代码推荐
Oct 14 PHP
WordPress中获取所使用的模板的页面ID的简单方法
Dec 31 PHP
PHP简单判断字符串是否包含另一个字符串的方法
Mar 25 PHP
Yii2增加验证码步骤详解
Apr 25 PHP
浅谈PHP中类和对象的相关函数
Apr 26 PHP
Yii框架数据库查询、增加、删除操作示例
Oct 14 PHP
配置Nginx+PHP的正确思路与过程
May 10 #PHP
WordPress中设置Post Type自定义文章类型的实例教程
May 10 #PHP
php+MySQL实现登录时验证登录名和密码是否正确
May 10 #PHP
PHP7+Nginx的配置与安装教程详解
May 10 #PHP
php+mysql实现的二级联动菜单效果详解
May 10 #PHP
浅析Yii2缓存的使用
May 10 #PHP
php简单统计在线人数的方法
May 10 #PHP
You might like
rephactor 优秀的PHP的重构工具
2011/06/09 PHP
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
2011/08/09 PHP
Symfony的安装和配置方法
2016/03/17 PHP
用JavaScript 处理 URL 的两个函数代码
2007/08/13 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
javascript记录文本框内文字个数检测文字个数变化
2014/10/14 Javascript
JQuery中上下文选择器实现方法
2015/05/18 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
2020/08/21 Javascript
jquery常用的12个小功能
2016/07/22 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
JS实现课堂随机点名和顺序点名
2017/03/09 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
微信小程序使用navigateTo数据传递的实例
2017/09/26 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
vue2.0 下拉框默认标题设置方法
2018/08/22 Javascript
Vue中使用sass实现换肤功能
2018/09/07 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
微信小程序跳转到其他网页(外部链接)的实现方法
2019/09/20 Javascript
JavaScript函数IIFE使用详解
2019/10/21 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
JavaScript实现点击切换验证码及校验
2021/01/10 Javascript
python脚本监控docker容器
2016/04/27 Python
python 定时修改数据库的示例代码
2018/04/08 Python
Python实现购物车购物小程序
2018/04/18 Python
解决DataFrame排序sort的问题
2018/06/07 Python
Python自动发送邮件的方法实例总结
2018/12/08 Python
基于Python实现船舶的MMSI的获取(推荐)
2019/10/21 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
2019/10/28 Python
html5构建触屏网站之网站尺寸探讨
2013/01/07 HTML / CSS
Smashbox官网:美国知名彩妆品牌
2017/01/05 全球购物
俄罗斯在线服装店:STOLNIK
2021/03/07 全球购物
护理职业生涯规划书
2014/01/24 职场文书
市级三好学生评语
2014/12/29 职场文书
学生病假条怎么写
2015/08/17 职场文书
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技