Discuz教程网

frename PHP 灵活文件命名函数 frename

[复制链接]
authicon dly 发表于 2011-9-3 19:32:55 | 显示全部楼层 |阅读模式
对付这种情况,有的做法是用时间戳对新文件进行重新命名,有的是用序号递增的方法,为了解决麻烦的操作,我在最近编写了一个frename函数,可以灵活依据自定义的规则取得上传文件的新命名,特此分享。
代码如下:

  1. <?php
  2. function frename($file, $rule='{timestamp}', $force = true) {
  3. /* -----------------------
  4. * author: m35
  5. * date: 2009/8/11
  6. * 依据命名规则取得文件的新命名,以处理上传文件等操作时遇到的文件名已存在的情况
  7. * @parm1 $file -- 文件物理路径
  8. * @parm2 $rule -- 命名规则, 默认为时间戳
  9. * @parm3 $force -- 是否强制命名,如果是强制,就算该目标文件不存在也会对其进行命名,默认强制
  10. * retrun str -- 依据$rule命名的新文件路径
  11. * 示例:
  12. echo '默认规则(时间戳):' . frename(__FILE__);
  13. echo '<br />序号递增规则:' . frename(__FILE__, '{name}{n}');
  14. echo '<br />n个前导0的序号递增规则:' . frename(__FILE__, '{name}{5n}');
  15. echo '<br />用分隔符<span style="color: #E00;">_</span>并带有3个前导0的序号递增规则:' . frename(__FILE__, '{3n}<_>{name}');
  16. echo '<br />使用时间日期元素组合的规则:' . frename(__FILE__, '{y}_{m}_{d}_{h}_{i}_{s}');
  17. echo '<br />使用简写形式的时间日期元素组合的规则:' . frename(__FILE__, '{Y}_{M}_{D}_{H}_{i}_{s}');
  18. echo '<br />其他自定义组合:' . frename(__FILE__, '{timestamp}_{name}<_>{n}');
  19. ----------------------- */
  20. if (!$force && !file_exists($file)) return $file;
  21. $filename = basename($file);
  22. $path = str_replace($filename, '', $file);
  23. $suffix = substr($filename, strrpos($filename, '.'));
  24. $name = str_replace($suffix, '', $filename);
  25. $timestamp = time();
  26. list($y, $Y, $m, $M, $d, $D, $h, $H, $i, $s) = explode(',', date('Y,y,m,n,d,j,h,G,i,s'));
  27. $tempname = str_replace(
  28. array('{name}', '{timestamp}', '{y}', '{Y}', '{m}', '{M}', '{d}', '{D}', '{h}', '{H}', '{i}', '{s}'),
  29. array($name, $timestamp, $y, $Y, $m, $M, $d, $D, $h, $H, $i, $s),
  30. $rule
  31. );
  32. if (preg_match('/\{(\d?)n\}/', $rule, $n)) {
  33. preg_match('/<([^>]+)>/', $tempname, $sep);
  34. $file = $path . str_replace(array($n[0], $sep[0]), array('', ''), $tempname) . $suffix;
  35. if (!file_exists($file)) return $file;
  36. $tempname = str_replace($sep[0], $sep[1], $tempname);
  37. $tname = $tempname;
  38. $i = 1;
  39. do {
  40. $nn = sprintf("%0{$n[1]}s", $i);
  41. $tempname = str_replace($n[0], $nn, $tname);
  42. $file = $path . $tempname . $suffix;
  43. }
  44. while (file_exists($file));
  45. return $file;
  46. } else {
  47. $file = $path . $tempname . $suffix;
  48. if (file_exists($file)) return false;
  49. else return $path . $tempname . $suffix;
  50. }
  51. }
  52. echo '默认规则(时间戳):' . frename(__FILE__);
  53. echo '<br />序号递增规则:' . frename(__FILE__, '{name}{n}');
  54. echo '<br />n个前导0的序号递增规则:' . frename(__FILE__, '{name}{5n}');
  55. echo '<br />用分隔符<span style="color: #E00;">_</span>并带有3个前导0的序号递增规则:' . frename(__FILE__, '{3n}<_>{name}');
  56. echo '<br />使用时间日期元素组合的规则:' . frename(__FILE__, '{y}_{m}_{d}_{h}_{i}_{s}');
  57. echo '<br />使用简写形式的时间日期元素组合的规则:' . frename(__FILE__, '{Y}_{M}_{D}_{H}_{i}_{s}');
  58. echo '<br />其他自定义组合:' . frename(__FILE__, '{timestamp}_{name}<_>{n}');
  59. ?>
复制代码








上一篇:PHP侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
下一篇:PHP 获取MSN好友列表的代码(2009-05-14测试通过)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-2 16:36

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表