thinkPHP5框架整合plupload实现图片批量上传功能的方法
2018-09-07 13:27
本文实例讲述了thinkPHP5框架整合plupload实现图片批量上传功能的方法。分享给大家供大家参考,具体如下:
在官网下载plupload
或者点击此处本站下载。
这里我们使用的是pluploadQueue
在HTML页面引入相应的css和js,然后根据示例代码修改为自己的代码
<link rel=stylesheet href=/assets/plupupload/css/jquery.plupload.queue.css rel=external nofollow type=text/css media=screen /> <div class=form-box-header><h3>{:lang(photo)}</h3></div> <div class=t-d-in-editor> <div class=t-d-in-box> <div id=uploader> <p>{:lang(plupupload_tip)}</p> </div> <div id=uploaded></div> </div> </div> <script type=text/javascript src=/assets/plupupload/plupload.full.min.js></script> <script type=text/javascript src=/assets/plupupload/jquery.plupload.queue.js></script> <script type=text/javascript> $(function() { // Setup html5 version $(#uploader).pluploadQueue({ // General settings runtimes : html5,flash,silverlight,html4, url : {:url(photo/upphoto)}, chunk_size: 1mb, rename : true, dragdrop: true, filters : { // Maximum file size max_file_size : 10mb, // Specify what files to browse for mime_types: [ {title : Image files, extensions : jpg,gif,png} ] }, // Resize images on clientside if we can resize : {width : 320, height : 240, quality : 90}, flash_swf_url : /assets/plupupload/Moxie.swf, silverlight_xap_url : /assets/plupupload/Moxie.xap, init: { PostInit: function() { $(#uploaded).html(); }, FileUploaded : function(uploader , files, result) { up_image = result.response; if(up_image != ){ $(#uploaded).append(<input type=hidden name=images[] value=+up_image+/>); //这里获取到上传结果 } } } }); }); </script>
plupload整合:
<?php /* * 文件上传 * * Donald * 2017-3-21 */ namespace app\backend\logic; use think\Model; class Plupupload extends Model{ public function upload_pic($file_type=data){ #!! IMPORTANT: #!! this file is just an example, it doesnt incorporate any security checks and #!! is not recommended to be used in production environment as it is. Be sure to #!! revise it and customize to your needs. // Make sure file is not cached (as it happens for example on iOS devices) 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); /* // Support CORS header(Access-Control-Allow-Origin: *); // other CORS headers if any... if ($_SERVER[REQUEST_METHOD] == OPTIONS) { exit; // finish preflight CORS requests here } */ // 5 minutes execution time @set_time_limit(5 * 60); // Uncomment this one to fake upload time // usleep(5000); // Settings //重新设置上传路径 $uploads = config(uploads_dir); if(!empty($file_type)){ $uploads = $uploads .$file_type./.date(Ymd); } $targetDir = $uploads; //$targetDir = uploads; $cleanupTargetDir = true; // Remove old files $maxFileAge = 5 * 3600; // Temp file age in seconds // Create target dir if (!file_exists($targetDir)) { @mkdir($targetDir); } // Get a file name if (isset($_REQUEST[name])) { $fileName = $_REQUEST[name]; } elseif (!empty($_FILES)) { $fileName = $_FILES[file][name]; } else { $fileName = uniqid(file_); } //重命名文件 $fileName_arr = explode(., $fileName); $fileName = myrule()...$fileName_arr[1]; //rule()请查看上篇我的上篇博客thinkphp同时上传多张图片文件重名问题 $filePath = $targetDir . DIRECTORY_SEPARATOR . $fileName; // Chunking might be enabled $chunk = isset($_REQUEST[chunk]) ? intval($_REQUEST[chunk]) : 0; $chunks = isset($_REQUEST[chunks]) ? intval($_REQUEST[chunks]) : 0; // 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}.part) { continue; } // Remove temp file if it is older than the max age and is not the current file if (preg_match(/\.part$/, $file) && (filemtime($tmpfilePath) < time() - $maxFileAge)) { @unlink($tmpfilePath); } } closedir($dir); } // Open temp file if (!$out = @fopen({$filePath}.part, $chunks ? ab : 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); // Check if file has been uploaded if (!$chunks $chunk == $chunks - 1) { // Strip the temp .part suffix off rename({$filePath}.part, $filePath); } // Return Success JSON-RPC response die($filePath); //这里直接返回结果 // die({jsonrpc : 2.0, result : .$filePath., id : id}); } }
最后Controller或Model获取结果并保存
$images = $request->post(images/a); //这里一定要注意, thinkphp通过name获取post数组时会获取不到数据,需要在name后加/a,表示获取数组详见Request的typeCast model(PhotoImage)->query_insert($images, $id);//批量插入图片 /** * 强制类型转换 * @param string $data * @param string $type * @return mixed */ private function typeCast(&$data, $type) { switch (strtolower($type)) { // 数组 case a: $data = (array) $data; break; // 数字 case d: $data = (int) $data; break; // 浮点 case f: $data = (float) $data; break; // 布尔 case b: $data = (boolean) $data; break; // 字符串 case s: default: if (is_scalar($data)) { $data = (string) $data; } else { throw new \InvalidArgumentException(variable type error: . gettype($data)); } } }
更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。
希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。
文章标题:thinkPHP5框架整合plupload实现图片批量上传功能的方法
文章链接:http://soscw.com/index.php/essay/12595.html