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_)讲解