frename PHP 灵活文件命名函数 frename

 更新时间:2009年09月09日 22:21:50   作者:  
用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 实现301重定向跳转实例代码

    php 实现301重定向跳转实例代码

    本文主要介绍php 实现301重定向跳转,通过实例代码让大家更好的理解重定向的方法,有需要的小伙伴可以参考下
    2016-07-07
  • PHP判断指定时间段的2个方法

    PHP判断指定时间段的2个方法

    有时我们需要在一天中的某个时间段进行某项任务,或者在一天中的不同小时里进行不同的任务,使用PHP如何实现呢,下面的两个例子都可以解决这个问题
    2014-03-03
  • PHP实现 APP端微信支付功能

    PHP实现 APP端微信支付功能

    这篇文章主要介绍了PHP实现 APP端微信支付功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • php面试中关于面向对象的相关问题

    php面试中关于面向对象的相关问题

    在本篇文章里小编整理了关于php面试中关于面向对象的相关问题内容,以及相关回答,有需要的朋友们学习下。
    2019-02-02
  • php实现websocket实时消息推送

    php实现websocket实时消息推送

    这篇文章主要为大家详细介绍了php实现websocket实时消息推送,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • thinkphp跨库操作的简单代码实例

    thinkphp跨库操作的简单代码实例

    下面小编就为大家带来一篇thinkphp跨库操作的简单代码实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • discuz论坛 用户登录 后台程序代码

    discuz论坛 用户登录 后台程序代码

    discuz论坛的程序可读性不好,晕晕的.为了整合论坛和网站数据,又不得不看.
    2008-11-11
  • Laravel学习教程之本地化模块

    Laravel学习教程之本地化模块

    这篇文章主要给大家介绍了关于Laravel学习教程之本地化模块的相关资料,文中通过示例代码给大家介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08
  • JS异常处理try..catch语句的作用和实例

    JS异常处理try..catch语句的作用和实例

    这篇文章主要介绍了JS异常处理的作用和实例,即try..catch语句,需要的朋友可以参考下
    2014-05-05
  • Codeigniter框架实现获取分页数据和总条数的方法

    Codeigniter框架实现获取分页数据和总条数的方法

    这篇文章主要介绍了Codeigniter框架实现获取分页数据和总条数的方法,实现了对获取当前页的数据和总条数方法的封装,是非常实用的技巧,需要的朋友可以参考下
    2014-12-12

最新评论