westdc-core/Westdc/File/Upload.php

331 lines
9.0 KiB
PHP
Raw Normal View History

<?php
/**
* Created by PhpStorm.
* User: liujin834
* Date: 14/12/26
* Time: 下午3:52
*/
namespace Westdc\File;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Westdc\EventModel\AbstractEventManager;
use Westdc\File\Listener\DefaultFileUploadListener;
class Upload extends AbstractEventManager implements ServiceManagerAwareInterface{
protected $serviceManager;
2015-01-13 09:24:11 +00:00
protected $defaultListener = false;
protected $returnInPreCheckTrigger = true;
private $uploadPath = "";
private $relativePath = "";
private $fileName = "";
private $config;
private $params;
2015-03-25 02:35:21 +00:00
private $rootPath,$childPath,$datePathMode;
//日期路径模式
const DATETIME_MODEL_YMD = "Y/M/D/";
const DATETIME_MODEL_YM = "Y/M/";
const DATETIME_MODEL_Y = "Y/";
public function setServiceManager(ServiceManager $serviceManager)
{
$this->serviceManager = $serviceManager;
$this->init();
return $this;
}
public function init()
{
$configService = $this->serviceManager->get('ConfigService');
$this->config = $configService->get('file.php');
}
2015-03-25 02:35:21 +00:00
public function __invoke($files,$rootDir = "",$childDir = "",$fileName = "",$dateDirModel = false)
{
return $this->upload($files,$rootDir,$childDir,$fileName,$dateDirModel);
}
/**
* 添加默认侦听器会将信息保存到Attachments数据表
*/
public function attachDefaultListener()
{
$Listener = new DefaultFileUploadListener;
$this->getEventManager()->attachAggregate($Listener);
2015-01-13 09:24:11 +00:00
$this->defaultListener = true;
}
/**
* 上传文件
* @param $files 上传文件的信息 e.g.$_FILE['fileData']
* @param string $rootDir 文件存储的根路径(磁盘物理路径),如果没有设置则从 config/autoload/file.php 中读取 upload 配置
* @param string $childDir 根路径中的下一级路径,默认为空
* @param string $fileName 新文件的文件名如果不指定则设置为新的UUID
2015-03-25 02:35:21 +00:00
* @param string|bool $dateDirModel 年月日目录模式,如果设为 false 则存储时不添加年月日路径,年月日路径在子文件夹中创建,unix和linux中需要开启上传目录的权限否则无法创建文件夹
* @return array
*/
2015-03-25 02:35:21 +00:00
public function upload($files,$rootDir = "",$childDir = "",$fileName = "",$dateDirModel = "")
{
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'));
if($this->returnInPreCheckTrigger === true)
{
2015-01-13 09:24:11 +00:00
$cache_data = $results->last();
if($cache_data !== true)
{
return $cache_data;
}
}
$fileService = $this->serviceManager->get('File');
2015-03-25 02:35:21 +00:00
if(!empty($rootDir))
$this->setRootDir($rootDir);
2015-03-25 02:35:21 +00:00
$this->MakeRootDir();
if(!empty($childDir))
$this->setChildDir($childDir);
$this->MakeChildDir($childDir);
if(!empty($dateDirModel))
$this->setDatePathMode($dateDirModel);
$this->makeDateDir();
2015-01-13 09:24:11 +00:00
if(empty($this->fileName) || empty($fileName))
$this->setFileName(NULL , $fileService->getFileTextExt($files['name']));
if(!empty($fileName))
$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);
2015-01-13 09:24:11 +00:00
if(!empty($this->params) && is_array($this->params))
{
$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;
}//文件上传
/**
2015-03-25 02:35:21 +00:00
* 设置上传根目录
* @param string $path
*/
public function setRootDir($path = ""){
$this->rootPath = $path;
}
/**
* 获取上传文件的根路径
* 根路径需要自行创建
* 路径结尾必须加 "/"
* @return bool
*/
2015-03-25 02:35:21 +00:00
public function MakeRootDir()
{
2015-03-25 02:35:21 +00:00
if(empty($this->rootPath))
$this->uploadPath = $this->config->upload;
2015-03-25 02:35:21 +00:00
else
$this->uploadPath = $this->rootPath;
if(!preg_match("/[\/|\\\]+$/",$this->uploadPath))
$this->uploadPath .= "/";
2015-03-25 02:35:21 +00:00
return $this->uploadPath;
}
public function setChildDir($dir = ""){
$this->childPath = $dir;
}
/**
* 设置子路径,自动加在根路径之后
* 如果不存在程序将创建
* @return bool | string
*/
2015-03-25 02:35:21 +00:00
public function MakeChildDir()
{
2015-03-25 02:35:21 +00:00
if(empty($this->childPath)) {
return true;
}
2015-03-25 02:35:21 +00:00
if (!preg_match("/[\/|\\\]+$/", $this->childPath))
$this->childPath .= "/";
2015-03-25 02:35:21 +00:00
$this->uploadPath .= $this->childPath;
if(!file_exists($this->uploadPath)) {
if(!mkdir($this->uploadPath))
return "failed to create folder :".$this->uploadPath;
}
2015-03-25 02:35:21 +00:00
$this->relativePath = $this->childPath;
}
/**
* 创建并返回年月日的子目录路径
2015-03-25 02:35:21 +00:00
* @param string $model
* @return string|bool
*/
2015-03-25 02:35:21 +00:00
public function makeDateDir($model = "")
{
2015-03-25 02:35:21 +00:00
if($model == ''){
$model = $this->getDatePathMode();
}
$current_path = "";
if(empty($model) || $model == false)
return $current_path;
$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
*/
2015-01-13 09:24:11 +00:00
public function setFileName($fileName,$fileExt = "")
{
if(!empty($fileName)){
2015-01-13 09:24:11 +00:00
if(empty($fileExt))
{
$fileExt = pathinfo($fileName,PATHINFO_EXTENSION);
}
if(empty($fileExt))
$this->fileName = $fileName;
else
$this->fileName = $fileName . "." .$fileExt;
return;
}
$tools = $this->serviceManager->get('Tools');
$uuid = $tools->uuid();
2015-01-13 09:24:11 +00:00
if(empty($fileExt))
$this->fileName = $uuid;
else
$this->fileName = $uuid . "." . $fileExt;
2015-01-13 09:24:11 +00:00
return;
}
/**
* @param $params
*/
public function setParams($params)
{
$this->params = $params;
}
/**
* 强制关闭文件上传前的钩子,默认是所有上传必须执行此钩子已避免上传文件不符合规格
* 除了后台中特殊的文件操作之外不建议关闭
*/
public function forceDetachPreCheckTrigger()
{
$this->returnInPreCheckTrigger = false;
}
/**
* @return string
*/
public function getFileName()
{
return $this->fileName;
}
/**
* @return string
*/
public function getUploadPath()
{
return $this->uploadPath;
}
/**
* @return string
*/
public function getRelativePath()
{
return $this->relativePath;
}
2015-03-25 02:35:21 +00:00
public function setDatePathMode($mode){
$this->datePathMode = $mode;
}
public function getDatePathMode(){
return $this->datePathMode;
}
}