frename PHP 灵活文件命名函数 frename
2015-01-24信息快讯网
用php上传文件或进行移动等文件操作时,一般都会处理文件命名的问题,如果用原文件名称,可能会遇到文件名已经存在的情况
对付这种情况,有的做法是用时间戳对新文件进行重新命名,有的是用序号递增的方法,为了解决麻烦的操作,我在最近编写了一个frename函数,可以灵活依据自定义的规则取得上传文件的新命名,特此分享。
<?php
function frename($file, $rule='{timestamp}', $force = true) {
/* -----------------------
* author: m35
* date: 2009/8/11
* 依据命名规则取得文件的新命名,以处理上传文件等操作时遇到的文件名已存在的情况
* @parm1 $file -- 文件物理路径
* @parm2 $rule -- 命名规则, 默认为时间戳
* @parm3 $force -- 是否强制命名,如果是强制,就算该目标文件不存在也会对其进行命名,默认强制
* retrun str -- 依据$rule命名的新文件路径
* 示例:
echo '默认规则(时间戳):' . frename(__FILE__);
echo '<br />序号递增规则:' . frename(__FILE__, '{name}{n}');
echo '<br />n个前导0的序号递增规则:' . frename(__FILE__, '{name}{5n}');
echo '<br />用分隔符<span style="color: #E00;">_</span>并带有3个前导0的序号递增规则:' . frename(__FILE__, '{3n}<_>{name}');
echo '<br />使用时间日期元素组合的规则:' . frename(__FILE__, '{y}_{m}_{d}_{h}_{i}_{s}');
echo '<br />使用简写形式的时间日期元素组合的规则:' . frename(__FILE__, '{Y}_{M}_{D}_{H}_{i}_{s}');
echo '<br />其他自定义组合:' . frename(__FILE__, '{timestamp}_{name}<_>{n}');
----------------------- */
if (!$force && !file_exists($file)) return $file;
$filename = basename($file);
$path = str_replace($filename, '', $file);
$suffix = substr($filename, strrpos($filename, '.'));
$name = str_replace($suffix, '', $filename);
$timestamp = time();
list($y, $Y, $m, $M, $d, $D, $h, $H, $i, $s) = explode(',', date('Y,y,m,n,d,j,h,G,i,s'));
$tempname = str_replace(
array('{name}', '{timestamp}', '{y}', '{Y}', '{m}', '{M}', '{d}', '{D}', '{h}', '{H}', '{i}', '{s}'),
array($name, $timestamp, $y, $Y, $m, $M, $d, $D, $h, $H, $i, $s),
$rule
);
if (preg_match('/\{(\d?)n\}/', $rule, $n)) {
preg_match('/<([^>]+)>/', $tempname, $sep);
$file = $path . str_replace(array($n[0], $sep[0]), array('', ''), $tempname) . $suffix;
if (!file_exists($file)) return $file;
$tempname = str_replace($sep[0], $sep[1], $tempname);
$tname = $tempname;
$i = 1;
do {
$nn = sprintf("%0{$n[1]}s", $i);
$tempname = str_replace($n[0], $nn, $tname);
$file = $path . $tempname . $suffix;
}
while (file_exists($file));
return $file;
} else {
$file = $path . $tempname . $suffix;
if (file_exists($file)) return false;
else return $path . $tempname . $suffix;
}
}
echo '默认规则(时间戳):' . frename(__FILE__);
echo '<br />序号递增规则:' . frename(__FILE__, '{name}{n}');
echo '<br />n个前导0的序号递增规则:' . frename(__FILE__, '{name}{5n}');
echo '<br />用分隔符<span style="color: #E00;">_</span>并带有3个前导0的序号递增规则:' . frename(__FILE__, '{3n}<_>{name}');
echo '<br />使用时间日期元素组合的规则:' . frename(__FILE__, '{y}_{m}_{d}_{h}_{i}_{s}');
echo '<br />使用简写形式的时间日期元素组合的规则:' . frename(__FILE__, '{Y}_{M}_{D}_{H}_{i}_{s}');
echo '<br />其他自定义组合:' . frename(__FILE__, '{timestamp}_{name}<_>{n}');
?>
PHP session有效期session.gc_maxlifetime
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
PHP中break及continue两个流程控制指令区别分析
php 5.3.5安装memcache注意事项小结
The specified CGI application misbehaved by not returning a complete set of HTTP headers
PHP stream_context_create()作用和用法分析
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
php函数之子字符串替换 str_replace
php expects parameter 1 to be resource, array given 错误
在MongoDB中模拟Auto Increment的php代码
zend framework多模块多布局配置
PHP MYSQL乱码问题,使用SET NAMES utf8校正
PHP 分页类(模仿google)-面试题目解答
PHPLog php 程序调试追踪工具
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
PHP 内存缓存加速功能memcached安装与用法
php download.php实现代码 跳转到下载文件(response.redirect)
PHP has encountered an Access Violation at 7C94BD02解决方法
PHP nl2br函数 将换行字符转成 <br>
php ignore_user_abort与register_shutdown_function 使用方法
UCenter Home二次开发指南
php 无限级 SelectTree 类
PHP memcache扩展的三种安装方法
Uchome1.2 1.5 代码学习 common.php
对squid中refresh_pattern的一些理解和建议
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
IStream与TStream之间的相互转换
mysql 中InnoDB和MyISAM的区别分析小结
PHP 中dirname(_file_)讲解