我的php开发经验快要2年了,成长速度还很慢吧,毕竟自己比较懒,很感激ThinkPHP团队的不断更新和努力完善TP框架,并坚持开源和免费提供使用,帮助我们这些开发人员更加方便的进行WEB应用的快速开发。这款简单却实用、轻量级却功能强大的框架,是我在开发项目中的重要支柱了。
现在说说今天在使用ThinkPHP中遇到的难题
小弟在开发一个后台管理的项目,需要多文件上传,结果: 上传图片出现重复问题,而且重复的很无规律;比如;图片1与图片2重复,图片3,图片4与图片5重复。。。。。没一点规律,顿时懵哔了。
网上搜了搜,看了下上传方法 upload()
private $config = array(
'mimes' => array(), //允许上传的文件MiMe类型
'maxSize' => 0, //上传的文件大小限制 (0-不做限制)
'exts' => array(), //允许上传的文件后缀
'autoSub' => true, //自动子目录保存文件
'subName' => array('date', 'Y-m-d'), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组
'rootPath' => './Uploads/', //保存根路径
'savePath' => '', //保存路径
'saveName' => array('uniqid', ''), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组
'saveExt' => '', //文件保存后缀,空则使用原后缀
'replace' => false, //存在同名是否覆盖
'hash' => true, //是否生成hash编码
'callback' => false, //检测文件是否存在回调,如果存在返回文件信息数组
'driver' => '', // 文件上传驱动
'driverConfig' => array(), // 上传驱动配置
);
配置项saveName清楚写到默认话按照uniqid方法命名,按照度娘的说法我需要在配置项重新修改配置:
$now = $_SERVER['REQUEST_TIME'];
$upload->saveName = array('uniqid',$now);//上传文件的保存规则
我草!!!!这样不对呐,
/**
* 根据指定的规则获取文件或目录名称
* @param array $rule 规则
* @param string $filename 原文件名
* @return string 文件或目录名称
*/
private function getName($rule, $filename){
$name = '';
if(is_array($rule)){ //数组规则
$func = $rule[0];
$param = (array)$rule[1];
foreach ($param as &$value) {
$value = str_replace('__FILE__', $filename, $value);
}
$name = call_user_func_array($func, $param);
} elseif (is_string($rule)){ //字符串规则
if(function_exists($rule)){
$name = call_user_func($rule);
} else {
$name = $rule;
}
}
return $name;
}
分析了后感觉没毛病,这句代码看脸?
后来群里一哥们也遇到这个问题,人家这样写的:
$upload->saveName = array('uniqid', array('', true));
我把之前项目试了试。。。。成了。
我就私聊那哥们用用我之前的方法
$now = $_SERVER['REQUEST_TIME'];
$upload->saveName = array('uniqid',$now);//上传文件的保存规则
看他行不行, 事实证明这个方法不稳定,那哥们也是可以的。
。。。。。。。。
总结:Thinkphp如果遇到多图上传重复,我选择
$upload->saveName = array('uniqid', array('', true));