controller.php

上传文件控制器,每个上传的文件都要经过此控制器


<?php
//header('Access-Control-Allow-Origin: http://www.baidu.com'); //设置http://www.baidu.com允许跨域访问
//header('Access-Control-Allow-Headers: X-Requested-With,X_Requested_With'); //设置允许的跨域header
date_default_timezone_set("Asia/chongqing");
error_reporting(E_ERROR);
header("Content-Type: text/html; charset=utf-8");

$CONFIG = json_decode(preg_replace("/\/\*[\s\S]+?\*\//", "", file_get_contents("config.json")), true);
$action = $_GET['action'];

switch ($action){
	case 'config':
		$result =  json_encode($CONFIG);
		break;
		
		
		
/* 
	上传文件操作:返回的数据格式
	array(
		"state" => "",          //上传状态,上传成功时必须返回"SUCCESS"
		"url" => "",            //返回的地址
		"title" => "",          //新文件名
		"original" => "",       //原始文件名
		"type" => "",            //文件类型
		"size" => "",           //文件大小
	);
 */
	/* 上传图片 */
	case 'uploadimage':
	/* 上传涂鸦 */
	case 'uploadscrawl':
	/* 上传视频 */
	case 'uploadvideo':
	/* 上传文件 */
	case 'uploadfile':
		$result = include("action_upload.php");
		break;
		
		
		
		
		
		
		
/* 
	列表操作:返回的数据格式
	array(
		"state"	=> "SUCCESS",		// 成功返回信息
		"start"	=> $start,			// 开始位置
		"total"	=> count($files),	// 文件个数统计
		// 当前列出的文件列表
		"list"	=> array(
			array('url' => '图片地址','mtime' => '时间戳'),
			array('url' => '图片地址','mtime' => '时间戳'),
		);
	)
*/
	/* 列出图片 */
	case 'listimage':
		$result = include("action_list.php");
		break;
	/* 列出文件 */
	case 'listfile':
		$result = include("action_list.php");
		break;
		
		
		
		
		
/* 
 * 抓取远程文件操作:返回的数据格式
 	array(
		'state'	=> count($list) ? 'SUCCESS':'ERROR',
		'list'	=> array(
			array(
				"state"		=> $info["state"],
				"url"		=> $info["url"],
				"size"		=> $info["size"],
				"title"		=> htmlspecialchars($info["title"]),
				"original"	=> htmlspecialchars($info["original"]),
				"source"	=> htmlspecialchars($imgUrl)
			)
			array(
				"state"		=> $info["state"],
				"url"		=> $info["url"],
				"size"		=> $info["size"],
				"title"		=> htmlspecialchars($info["title"]),
				"original"	=> htmlspecialchars($info["original"]),
				"source"	=> htmlspecialchars($imgUrl)
			)
		)
	)
*/

	/* 抓取远程文件 */
	case 'catchimage':
		$result = include("action_crawler.php");
		break;

	default:
		$result = json_encode(array(
			'state'=> '请求地址出错'
		));
		break;
}


/* 输出结果 */
if (isset($_GET["callback"])) {
	if (preg_match("/^[\w_]+$/", $_GET["callback"])) {
		echo htmlspecialchars($_GET["callback"]) . '(' . $result . ')';
	} else {
		echo json_encode(array('state'=> 'callback参数不合法'));
	}
} else {
	echo $result;
}




action_upload.php

上传文件操作,图片、视频、。。




<?php
/**
 * 上传附件和上传视频
 * User: Jinqn
 * Date: 14-04-09
 * Time: 上午10:17
 * 返回的数据格式
	array(
		"state" => "",          //上传状态,上传成功时必须返回"SUCCESS"
		"url" => "",            //返回的地址
		"title" => "",          //新文件名
		"original" => "",       //原始文件名
		"type" => ""            //文件类型
		"size" => "",           //文件大小
	)
 */
include "Uploader.class.php";

/**
* 上传配置
* 读取对应配置文件
* @param 
*/
$base64 = "upload";
switch (htmlspecialchars($_GET['action'])) {
	
	case 'uploadimage':
		$config = array(
			"pathFormat"	=> $CONFIG['imagePathFormat'],// 上传图片命名规则
			"maxSize"		=> $CONFIG['imageMaxSize'],// 上传图片文件最大大小
			"allowFiles"		=> $CONFIG['imageAllowFiles']// 上传允许的图片类型
		);
		$fieldName = $CONFIG['imageFieldName'];//提交的图片表单名称
		break;
		
		
	case 'uploadscrawl':
		$config = array(
			"pathFormat"	=> $CONFIG['scrawlPathFormat'],// 抓取文件的命名规则
			"maxSize"		=> $CONFIG['scrawlMaxSize'],// 抓取文件最大大小
			"allowFiles"		=> $CONFIG['scrawlAllowFiles'],// 允许抓取的文件类型
			"oriName"		=> "scrawl.png"
		);
		$fieldName	= $CONFIG['scrawlFieldName'];//提交的图片表单名称
		$base64		= "base64";
		break;
		
		
	case 'uploadvideo':
		$config = array(
			"pathFormat"	=> $CONFIG['videoPathFormat'],// 视频文件命名规则
			"maxSize"		=> $CONFIG['videoMaxSize'],// 视频文件最大大小
			"allowFiles"		=> $CONFIG['videoAllowFiles']//允许的视频文件类型
		);
		$fieldName = $CONFIG['videoFieldName'];//提交的视频表单名称
		break;
		
		
	case 'uploadfile':
	default:
		$config = array(
			"pathFormat" => $CONFIG['filePathFormat'],// 上传文件命名规则
			"maxSize" => $CONFIG['fileMaxSize'],//上传文件的最大大小
			"allowFiles" => $CONFIG['fileAllowFiles']// 允许的上传文件类型
		);
		$fieldName = $CONFIG['fileFieldName'];//提交的文件表单名称
		break;
}

/* 生成上传实例对象并完成上传 */
/**
 * 上传文件类
 * @param string	$fileField	表单名称
 * @param array		$config		配置项
 * @param bool		$base64		是否解析base64编码,可省略。若开启,则$fileField代表的是base64编码的字符串表单名
 */
$up = new Uploader($fieldName, $config, $base64);

/**
 * 得到上传文件所对应的各个参数,数组结构
 * array(
		"state" => "",          //上传状态,上传成功时必须返回"SUCCESS"
		"url" => "",            //返回的地址
		"title" => "",          //新文件名
		"original" => "",       //原始文件名
		"type" => ""            //文件类型
		"size" => "",           //文件大小
	)
 */

/* 返回数据 */
return json_encode($up->getFileInfo());



action_crawler.php

远程抓取文件


<?php
/**
 * 抓取远程图片
 * User: Jinqn
 * Date: 14-04-14
 * Time: 下午19:18
 * 返回的数据格式
 	array(
		'state'	=> count($list) ? 'SUCCESS':'ERROR',
		'list'	=> array(
			array(
				"state"		=> $info["state"],
				"url"		=> $info["url"],
				"size"		=> $info["size"],
				"title"		=> htmlspecialchars($info["title"]),
				"original"	=> htmlspecialchars($info["original"]),
				"source"	=> htmlspecialchars($imgUrl)
			)
			array(
				"state"		=> $info["state"],
				"url"		=> $info["url"],
				"size"		=> $info["size"],
				"title"		=> htmlspecialchars($info["title"]),
				"original"	=> htmlspecialchars($info["original"]),
				"source"	=> htmlspecialchars($imgUrl)
			)
		)
	)
 */
 
 
set_time_limit(0);
include("Uploader.class.php");

/* 上传配置 */
$config = array(
	"pathFormat"	=> $CONFIG['catcherPathFormat'],
	"maxSize"		=> $CONFIG['catcherMaxSize'],
	"allowFiles"		=> $CONFIG['catcherAllowFiles'],
	"oriName"		=> "remote.png"
);
$fieldName = $CONFIG['catcherFieldName'];


/* 抓取远程图片 */
$list = array();
if (isset($_POST[$fieldName])) {
	$source = $_POST[$fieldName];
} else {
	$source = $_GET[$fieldName];
}

foreach ($source as $imgUrl) {
	$item = new Uploader($imgUrl, $config, "remote");
	// 上传文件的返回信息
	$info = $item->getFileInfo();
	array_push(
		$list,
		array(
			"state"		=> $info["state"],
			"url"		=> $info["url"],
			"size"		=> $info["size"],
			"title"		=> htmlspecialchars($info["title"]),
			"original"	=> htmlspecialchars($info["original"]),
			"source"	=> htmlspecialchars($imgUrl)
		)
	);
}

/* 返回抓取数据 */
return json_encode(
	array(
		'state'	=> count($list) ? 'SUCCESS':'ERROR',
		'list'	=> $list
	)
);


action_list.php

获取文件列表

<?php
/**
 * 获取已上传的文件列表
 * User: Jinqn
 * Date: 14-04-09
 * Time: 上午10:17
 * 
 * 要返回的数据的格式
	array(
		"state"	=> "SUCCESS",		// 成功返回信息
		"start"	=> $start,			// 开始位置
		"total"	=> count($files),	// 文件个数统计
		// 当前列出的文件列表
		"list"	=> array(
			array('url' => '图片地址','mtime' => '时间戳'),
			array('url' => '图片地址','mtime' => '时间戳'),
		);
	)
 */

 
include "Uploader.class.php";

/* 判断类型 */
switch ($_GET['action']) {
	/* 列出文件 */
	case 'listfile':
		$allowFiles	= $CONFIG['fileManagerAllowFiles'];
		$listSize		= $CONFIG['fileManagerListSize'];
		$path		= $CONFIG['fileManagerListPath'];
		break;
		
	/* 列出图片 */
	case 'listimage':
	default:
		$allowFiles	= $CONFIG['imageManagerAllowFiles'];
		$listSize		= $CONFIG['imageManagerListSize'];
		$path		= $CONFIG['imageManagerListPath'];
}

$allowFiles = substr(str_replace(".", "|", join("", $allowFiles)), 1);

/* 获取参数 */
$size	= isset($_GET['size']) ? htmlspecialchars($_GET['size']) : $listSize;
$start	= isset($_GET['start']) ? htmlspecialchars($_GET['start']) : 0;
$end	= $start + $size;

/* 获取文件列表 */
$path = $_SERVER['DOCUMENT_ROOT'] . (substr($path, 0, 1) == "/" ? "":"/") . $path;

// 获取要列出文件的文件列表
$files = getfiles($path, $allowFiles);

// 没有文件列表数据时返回
if (!count($files)) {
	return json_encode(array(
		"state"	=> "no match file",
		"list"	=> array(),
		"start"	=> $start,
		"total"	=> count($files)
	));
}

/* 获取指定范围的列表 */
$len = count($files);
for ($i = min($end, $len) - 1, $list = array(); $i < $len && $i >= 0 && $i >= $start; $i--){
	$list[] = $files[$i];
}

//倒序
//for ($i = $end, $list = array(); $i < $len && $i < $end; $i++){
//    $list[] = $files[$i];
//}

/**
* 返回数据文件列表
* @param 
*/
$result = json_encode(
	array(
		"state"	=> "SUCCESS",	// 成功返回信息
		"list"	=> $list,		// 当前列出的文件列表
		"start"	=> $start,		// 开始位置
		"total"	=> count($files)	// 文件个数统计
	)
);

return $result;


/**
 * 遍历获取目录下的指定类型的文件,并返回所有目录下文件的列表数组
 * 
 * @param	string	$path 		文件路劲
 * @param	array	$allowFiles	要列出列表的文件类型
 * @param	array	$files		[可选]要返回的数组,地址引用
 * @return	array	
		array(
			array('url' => '图片地址','mtime' => '时间戳'),
			array('url' => '图片地址','mtime' => '时间戳'),
		);
 */
function getfiles($path, $allowFiles, &$files = array())
{
	if (!is_dir($path)) return null;
	if(substr($path, strlen($path) - 1) != '/') $path .= '/';
	$handle = opendir($path);
	while (false !== ($file = readdir($handle))) {
		if ($file != '.' && $file != '..') {
			$path2 = $path . $file;
			if (is_dir($path2)) {
				getfiles($path2, $allowFiles, $files);
			} else {
				if (preg_match("/\.(".$allowFiles.")$/i", $file)) {
					$files[] = array(
						'url'		=> substr($path2, strlen($_SERVER['DOCUMENT_ROOT'])),
						'mtime'	=> filemtime($path2)
					);
				}
			}
		}
	}
	return $files;
}