frename PHP 灵活文件命名函数 frename |
对付这种情况,有的做法是用时间戳对新文件进行重新命名,有的是用序号递增的方法,为了解决麻烦的操作,我在最近编写了一个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}); ?> |