2014-12-26 13:45:05 +00:00
|
|
|
|
<?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;
|
2014-12-27 16:03:41 +00:00
|
|
|
|
use Westdc\File\Listener\DefaultFileUploadListener;
|
2014-12-26 13:45:05 +00:00
|
|
|
|
|
|
|
|
|
class Upload extends AbstractEventManager implements ServiceManagerAwareInterface{
|
|
|
|
|
|
|
|
|
|
protected $serviceManager;
|
|
|
|
|
|
|
|
|
|
private $uploadPath = "";
|
|
|
|
|
private $relativePath = "";
|
|
|
|
|
private $fileName = "";
|
|
|
|
|
private $config;
|
2014-12-28 15:37:16 +00:00
|
|
|
|
private $params;
|
2014-12-26 13:45:05 +00:00
|
|
|
|
|
2014-12-27 16:33:12 +00:00
|
|
|
|
//日期路径模式
|
2014-12-27 16:03:41 +00:00
|
|
|
|
const DATETIME_MODEL_YMD = "Y/M/D/";
|
|
|
|
|
const DATETIME_MODEL_YM = "Y/M/";
|
|
|
|
|
const DATETIME_MODEL_Y = "Y/";
|
|
|
|
|
|
2014-12-26 13:45:05 +00:00
|
|
|
|
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');
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-27 16:33:12 +00:00
|
|
|
|
public function __invoke($files,$rootDir = "",$childDir = "",$fileName = "",$dateDirModel = self::DATETIME_MODEL_YMD)
|
|
|
|
|
{
|
2014-12-28 15:37:16 +00:00
|
|
|
|
return $this->upload($files,$rootDir,$childDir,$fileName,$dateDirModel);
|
2014-12-27 16:33:12 +00:00
|
|
|
|
}
|
2014-12-27 16:03:41 +00:00
|
|
|
|
|
2015-01-12 12:59:23 +00:00
|
|
|
|
/**
|
|
|
|
|
* 添加默认侦听器,会将信息保存到Attachments数据表
|
|
|
|
|
*/
|
|
|
|
|
public function attachDefaultListener()
|
|
|
|
|
{
|
|
|
|
|
$Listener = new DefaultFileUploadListener;
|
|
|
|
|
$this->getEventManager()->attachAggregate($Listener);
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-27 16:33:12 +00:00
|
|
|
|
/**
|
|
|
|
|
* 上传文件
|
|
|
|
|
* @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
|
|
|
|
|
*/
|
2014-12-27 16:03:41 +00:00
|
|
|
|
public function upload($files,$rootDir = "",$childDir = "",$fileName = "",$dateDirModel = self::DATETIME_MODEL_YMD)
|
2014-12-26 13:45:05 +00:00
|
|
|
|
{
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-27 16:03:41 +00:00
|
|
|
|
$fileService = $this->serviceManager->get('File');
|
2014-12-26 13:45:05 +00:00
|
|
|
|
|
2014-12-27 16:03:41 +00:00
|
|
|
|
$this->setRootDir($rootDir);
|
|
|
|
|
$this->setChildDir($childDir);
|
2014-12-26 13:45:05 +00:00
|
|
|
|
|
2014-12-27 16:03:41 +00:00
|
|
|
|
if($dateDirModel !== false)
|
|
|
|
|
$this->makeDateDir($dateDirModel);
|
2014-12-26 13:45:05 +00:00
|
|
|
|
|
2014-12-27 16:03:41 +00:00
|
|
|
|
$this->setFileName($fileName , $fileService->getFileTextExt($files['name']));
|
2014-12-26 13:45:05 +00:00
|
|
|
|
|
|
|
|
|
//移动文件
|
2014-12-27 16:03:41 +00:00
|
|
|
|
$file_path = $this->getUploadPath() . $this->getFileName();
|
2014-12-26 13:45:05 +00:00
|
|
|
|
|
|
|
|
|
if (move_uploaded_file($file['tmp_name'], $file_path) === false) {
|
|
|
|
|
return array("error"=>"上传失败,请重试");
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-27 16:03:41 +00:00
|
|
|
|
$file_data = array();
|
2014-12-28 15:37:16 +00:00
|
|
|
|
|
2014-12-27 16:03:41 +00:00
|
|
|
|
$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']);
|
2014-12-28 15:37:16 +00:00
|
|
|
|
$file_data['file_mime'] = $fileService->getFileMime($file_path);
|
|
|
|
|
|
|
|
|
|
if(!empty($file_data) && is_array($file_data))
|
|
|
|
|
{
|
|
|
|
|
$file_data = array_merge($file_data,$this->params);
|
|
|
|
|
}
|
2014-12-26 13:45:05 +00:00
|
|
|
|
|
2014-12-27 16:03:41 +00:00
|
|
|
|
$results = $this->getEventManager()->trigger('upload.after', $this, compact('file_data'));
|
|
|
|
|
$cache_data = $results->last();
|
2014-12-26 13:45:05 +00:00
|
|
|
|
|
2014-12-27 16:03:41 +00:00
|
|
|
|
if(is_array($cache_data))
|
|
|
|
|
$file_data = array_merge($file_data , $cache_data);
|
2014-12-26 13:45:05 +00:00
|
|
|
|
|
2014-12-27 16:03:41 +00:00
|
|
|
|
return $file_data;
|
2014-12-26 13:45:05 +00:00
|
|
|
|
}//文件上传
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 设置上传文件的根路径,这样操作会忽略config中的定义
|
|
|
|
|
* 根路径需要自行创建
|
|
|
|
|
* 路径结尾必须加 "/"
|
|
|
|
|
* @param string $path
|
2014-12-27 16:03:41 +00:00
|
|
|
|
* @return bool
|
2014-12-26 13:45:05 +00:00
|
|
|
|
*/
|
|
|
|
|
public function setRootDir($path = "")
|
|
|
|
|
{
|
|
|
|
|
if(empty($path))
|
|
|
|
|
$this->uploadPath = $this->config->upload;
|
|
|
|
|
|
|
|
|
|
$this->uploadPath = $path;
|
|
|
|
|
|
|
|
|
|
if(!preg_match("/[\/|\\\]+$/",$this->uploadPath))
|
|
|
|
|
$this->uploadPath .= "/";
|
2014-12-27 16:03:41 +00:00
|
|
|
|
|
|
|
|
|
return true;
|
2014-12-26 13:45:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 设置子路径,自动加在根路径之后
|
|
|
|
|
* 如果不存在程序将创建
|
2014-12-27 16:03:41 +00:00
|
|
|
|
* @param string $dirname
|
|
|
|
|
* @return bool | string
|
2014-12-26 13:45:05 +00:00
|
|
|
|
*/
|
|
|
|
|
public function setChildDir($dirname)
|
|
|
|
|
{
|
|
|
|
|
if(empty($dirname)) {
|
2014-12-27 16:03:41 +00:00
|
|
|
|
return true;
|
2014-12-26 13:45:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->uploadPath .= $dirname;
|
|
|
|
|
|
|
|
|
|
if (!preg_match("/[\/|\\\]+$/", $this->uploadPath))
|
|
|
|
|
$this->uploadPath .= "/";
|
|
|
|
|
|
|
|
|
|
|
2014-12-27 16:03:41 +00:00
|
|
|
|
if(!file_exists($this->uploadPath)) {
|
|
|
|
|
if(!mkdir($this->uploadPath))
|
|
|
|
|
return "failed to create folder :".$this->uploadPath;
|
|
|
|
|
}
|
2014-12-26 13:45:05 +00:00
|
|
|
|
|
|
|
|
|
$this->relativePath = $dirname;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建并返回年月日的子目录路径
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
2014-12-27 16:03:41 +00:00
|
|
|
|
public function makeDateDir($model)
|
2014-12-26 13:45:05 +00:00
|
|
|
|
{
|
|
|
|
|
$y = date("Y");
|
|
|
|
|
$m = date("m");
|
|
|
|
|
$d = date("d");
|
|
|
|
|
|
2014-12-27 16:03:41 +00:00
|
|
|
|
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);
|
2014-12-26 13:45:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2014-12-27 16:03:41 +00:00
|
|
|
|
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);
|
2014-12-26 13:45:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2014-12-27 16:03:41 +00:00
|
|
|
|
if($model == self::DATETIME_MODEL_YMD) {
|
|
|
|
|
$current_path .= $d ."/";
|
|
|
|
|
if (!file_exists($this->uploadPath . $current_path))
|
|
|
|
|
mkdir($this->uploadPath . $current_path);
|
2014-12-26 13:45:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$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;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-28 15:37:16 +00:00
|
|
|
|
|
|
|
|
|
public function setParams($params)
|
|
|
|
|
{
|
|
|
|
|
$this->params = $params;
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-26 13:45:05 +00:00
|
|
|
|
/**
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
public function getFileName()
|
|
|
|
|
{
|
|
|
|
|
return $this->fileName;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
public function getUploadPath()
|
|
|
|
|
{
|
|
|
|
|
return $this->uploadPath;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
public function getRelativePath()
|
|
|
|
|
{
|
|
|
|
|
return $this->relativePath;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|