serviceManager = $serviceManager; $this->init(); return $this; } public function init() { $Listener = new DefaultFileUploadListener; $this->getEventManager()->attachAggregate($Listener); $configService = $this->serviceManager->get('ConfigService'); $this->config = $configService->get('file.php'); } public function __invoke($files,$rootDir = "",$childDir = "",$fileName = "",$dateDirModel = self::DATETIME_MODEL_YMD) { return $this->upload($files,$rootDir,$childDir,$fileName,$dateDirModel); } /** * 上传文件 * @param $files 上传文件的信息 e.g.$_FILE['fileData'] * @param string $rootDir 文件存储的根路径(磁盘物理路径),如果没有设置则从 config/autoload/file.php 中读取 upload 配置 * @param string $childDir 根路径中的下一级路径,默认为空 * @param string $fileName 新文件的文件名,如果不指定则设置为新的UUID * @param string $dateDirModel 年月日目录模式,如果设为 false 则存储时不添加年月日路径,年月日路径在子文件夹中创建,unix和linux中需要开启上传目录的权限,否则无法创建文件夹 * @return array */ public function upload($files,$rootDir = "",$childDir = "",$fileName = "",$dateDirModel = self::DATETIME_MODEL_YMD) { if (empty($files) !== false) { return array("error"=>"请选择要上传的文件."); } if (is_uploaded_file($files['tmp_name']) === false) { return array("error"=>"文件上传失败,请重新上传"); } $file = $files; $results = $this->getEventManager()->trigger('upload.pre', $this, compact('file')); $cache_data = $results->last(); if($cache_data !== true) { return $cache_data; } $fileService = $this->serviceManager->get('File'); $this->setRootDir($rootDir); $this->setChildDir($childDir); if($dateDirModel !== false) $this->makeDateDir($dateDirModel); $this->setFileName($fileName , $fileService->getFileTextExt($files['name'])); //移动文件 $file_path = $this->getUploadPath() . $this->getFileName(); if (move_uploaded_file($file['tmp_name'], $file_path) === false) { return array("error"=>"上传失败,请重试"); } $file_data = array(); $file_data['file_url'] = $this->getRelativePath() . $this->getFileName(); $file_data['file_size'] = $files['size']; $file_data['db_path'] = $this->getRelativePath() . $this->getFileName(); $file_data['realname'] = $files['name']; $file_data['file_ext'] = $fileService->getFileTextExt($files['name']); $file_data['file_mime'] = $fileService->getFileMime($file_path); if(!empty($file_data) && is_array($file_data)) { $file_data = array_merge($file_data,$this->params); } $results = $this->getEventManager()->trigger('upload.after', $this, compact('file_data')); $cache_data = $results->last(); if(is_array($cache_data)) $file_data = array_merge($file_data , $cache_data); return $file_data; }//文件上传 /** * 设置上传文件的根路径,这样操作会忽略config中的定义 * 根路径需要自行创建 * 路径结尾必须加 "/" * @param string $path * @return bool */ public function setRootDir($path = "") { if(empty($path)) $this->uploadPath = $this->config->upload; $this->uploadPath = $path; if(!preg_match("/[\/|\\\]+$/",$this->uploadPath)) $this->uploadPath .= "/"; return true; } /** * 设置子路径,自动加在根路径之后 * 如果不存在程序将创建 * @param string $dirname * @return bool | string */ public function setChildDir($dirname) { if(empty($dirname)) { return true; } $this->uploadPath .= $dirname; if (!preg_match("/[\/|\\\]+$/", $this->uploadPath)) $this->uploadPath .= "/"; if(!file_exists($this->uploadPath)) { if(!mkdir($this->uploadPath)) return "failed to create folder :".$this->uploadPath; } $this->relativePath = $dirname; } /** * 创建并返回年月日的子目录路径 * @return string */ public function makeDateDir($model) { $y = date("Y"); $m = date("m"); $d = date("d"); if($model == self::DATETIME_MODEL_YMD || $model == self::DATETIME_MODEL_YM || $model == self::DATETIME_MODEL_Y) { $current_path = $y . "/"; if (!file_exists($this->uploadPath . $current_path)) mkdir($this->uploadPath . $current_path); } if($model == self::DATETIME_MODEL_YMD || $model == self::DATETIME_MODEL_YM){ $current_path .= $m . "/"; if (!file_exists($this->uploadPath . $current_path)) mkdir($this->uploadPath . $current_path); } if($model == self::DATETIME_MODEL_YMD) { $current_path .= $d ."/"; if (!file_exists($this->uploadPath . $current_path)) mkdir($this->uploadPath . $current_path); } $this->uploadPath .= $current_path; $this->relativePath .= $current_path; return $current_path; } /** * @param $fileName * @param $fileExt */ public function setFileName($fileName,$fileExt) { if(!empty($fileName)){ $this->fileName = $fileName . "." .$fileExt; return; } $tools = $this->serviceManager->get('Tools'); $uuid = $tools->uuid(); $this->fileName = $uuid . "." . $fileExt; } public function setParams($params) { $this->params = $params; } /** * @return string */ public function getFileName() { return $this->fileName; } /** * @return string */ public function getUploadPath() { return $this->uploadPath; } /** * @return string */ public function getRelativePath() { return $this->relativePath; } }