frename PHP 靈活文件命名函數(shù) frename
更新時(shí)間:2009年09月09日 22:21:50 作者:
用php上傳文件或進(jìn)行移動(dòng)等文件操作時(shí),一般都會(huì)處理文件命名的問題,如果用原文件名稱,可能會(huì)遇到文件名已經(jīng)存在的情況
對(duì)付這種情況,有的做法是用時(shí)間戳對(duì)新文件進(jìn)行重新命名,有的是用序號(hào)遞增的方法,為了解決麻煩的操作,我在最近編寫了一個(gè)frename函數(shù),可以靈活依據(jù)自定義的規(guī)則取得上傳文件的新命名,特此分享。
<?php
function frename($file, $rule='{timestamp}', $force = true) {
/* -----------------------
* author: m35
* date: 2009/8/11
* 依據(jù)命名規(guī)則取得文件的新命名,以處理上傳文件等操作時(shí)遇到的文件名已存在的情況
* @parm1 $file -- 文件物理路徑
* @parm2 $rule -- 命名規(guī)則, 默認(rèn)為時(shí)間戳
* @parm3 $force -- 是否強(qiáng)制命名,如果是強(qiáng)制,就算該目標(biāo)文件不存在也會(huì)對(duì)其進(jìn)行命名,默認(rèn)強(qiáng)制
* retrun str -- 依據(jù)$rule命名的新文件路徑
* 示例:
echo '默認(rèn)規(guī)則(時(shí)間戳):' . frename(__FILE__);
echo '<br />序號(hào)遞增規(guī)則:' . frename(__FILE__, '{name}{n}');
echo '<br />n個(gè)前導(dǎo)0的序號(hào)遞增規(guī)則:' . frename(__FILE__, '{name}{5n}');
echo '<br />用分隔符<span style="color: #E00;">_</span>并帶有3個(gè)前導(dǎo)0的序號(hào)遞增規(guī)則:' . frename(__FILE__, '{3n}<_>{name}');
echo '<br />使用時(shí)間日期元素組合的規(guī)則:' . frename(__FILE__, '{y}_{m}_0okwnro_{h}_{i}_{s}');
echo '<br />使用簡(jiǎn)寫形式的時(shí)間日期元素組合的規(guī)則:' . 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}', '0rtfm7t', '{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 '默認(rèn)規(guī)則(時(shí)間戳):' . frename(__FILE__);
echo '<br />序號(hào)遞增規(guī)則:' . frename(__FILE__, '{name}{n}');
echo '<br />n個(gè)前導(dǎo)0的序號(hào)遞增規(guī)則:' . frename(__FILE__, '{name}{5n}');
echo '<br />用分隔符<span style="color: #E00;">_</span>并帶有3個(gè)前導(dǎo)0的序號(hào)遞增規(guī)則:' . frename(__FILE__, '{3n}<_>{name}');
echo '<br />使用時(shí)間日期元素組合的規(guī)則:' . frename(__FILE__, '{y}_{m}_brna7sj_{h}_{i}_{s}');
echo '<br />使用簡(jiǎn)寫形式的時(shí)間日期元素組合的規(guī)則:' . frename(__FILE__, '{Y}_{M}_{D}_{H}_{i}_{s}');
echo '<br />其他自定義組合:' . frename(__FILE__, '{timestamp}_{name}<_>{n}');
?>
復(fù)制代碼 代碼如下:
<?php
function frename($file, $rule='{timestamp}', $force = true) {
/* -----------------------
* author: m35
* date: 2009/8/11
* 依據(jù)命名規(guī)則取得文件的新命名,以處理上傳文件等操作時(shí)遇到的文件名已存在的情況
* @parm1 $file -- 文件物理路徑
* @parm2 $rule -- 命名規(guī)則, 默認(rèn)為時(shí)間戳
* @parm3 $force -- 是否強(qiáng)制命名,如果是強(qiáng)制,就算該目標(biāo)文件不存在也會(huì)對(duì)其進(jìn)行命名,默認(rèn)強(qiáng)制
* retrun str -- 依據(jù)$rule命名的新文件路徑
* 示例:
echo '默認(rèn)規(guī)則(時(shí)間戳):' . frename(__FILE__);
echo '<br />序號(hào)遞增規(guī)則:' . frename(__FILE__, '{name}{n}');
echo '<br />n個(gè)前導(dǎo)0的序號(hào)遞增規(guī)則:' . frename(__FILE__, '{name}{5n}');
echo '<br />用分隔符<span style="color: #E00;">_</span>并帶有3個(gè)前導(dǎo)0的序號(hào)遞增規(guī)則:' . frename(__FILE__, '{3n}<_>{name}');
echo '<br />使用時(shí)間日期元素組合的規(guī)則:' . frename(__FILE__, '{y}_{m}_0okwnro_{h}_{i}_{s}');
echo '<br />使用簡(jiǎn)寫形式的時(shí)間日期元素組合的規(guī)則:' . 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}', '0rtfm7t', '{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 '默認(rèn)規(guī)則(時(shí)間戳):' . frename(__FILE__);
echo '<br />序號(hào)遞增規(guī)則:' . frename(__FILE__, '{name}{n}');
echo '<br />n個(gè)前導(dǎo)0的序號(hào)遞增規(guī)則:' . frename(__FILE__, '{name}{5n}');
echo '<br />用分隔符<span style="color: #E00;">_</span>并帶有3個(gè)前導(dǎo)0的序號(hào)遞增規(guī)則:' . frename(__FILE__, '{3n}<_>{name}');
echo '<br />使用時(shí)間日期元素組合的規(guī)則:' . frename(__FILE__, '{y}_{m}_brna7sj_{h}_{i}_{s}');
echo '<br />使用簡(jiǎn)寫形式的時(shí)間日期元素組合的規(guī)則:' . frename(__FILE__, '{Y}_{M}_{D}_{H}_{i}_{s}');
echo '<br />其他自定義組合:' . frename(__FILE__, '{timestamp}_{name}<_>{n}');
?>
相關(guān)文章
關(guān)于DISCUZ不用通行證登陸得內(nèi)容介紹
DISCUZ是中國(guó)最常用的論壇,雖然他本身有通行證給大家連接,但實(shí)際上用戶的統(tǒng)一還是很不好,經(jīng)常要建立兩個(gè)用戶表,第一不利于注冊(cè)和管理,第二浪費(fèi)數(shù)據(jù)庫。2008-10-10
yii實(shí)現(xiàn)使用CUploadedFile上傳文件的方法
這篇文章主要介紹了yii實(shí)現(xiàn)使用CUploadedFile上傳文件的方法,結(jié)合具體的前端與后端處理代碼實(shí)例分析了CUploadedFile類的使用方法,需要的朋友可以參考下2015-12-12
CodeIgniter框架驗(yàn)證碼類庫文件與用法示例
這篇文章主要介紹了CodeIgniter框架驗(yàn)證碼類庫文件與用法,結(jié)合實(shí)例形式分析了CodeIgniter框架驗(yàn)證碼類庫文件的定義與具體使用方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03
YII2框架中操作數(shù)據(jù)庫的方式實(shí)例分析
這篇文章主要介紹了YII2框架中操作數(shù)據(jù)庫的方式,結(jié)合實(shí)例形式總結(jié)分析了YII2使用createCommand方式及AR(Active Record)方式操作數(shù)據(jù)庫相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2020-03-03
使用PHP處理數(shù)據(jù)庫數(shù)據(jù)如何將數(shù)據(jù)返回客戶端并顯示當(dāng)前狀態(tài)
這篇文章給大家介紹使用php處理大量數(shù)據(jù),每處理一個(gè)數(shù)據(jù)返回客戶端顯示當(dāng)前狀態(tài)的方法,對(duì)PHP處理數(shù)據(jù)庫數(shù)據(jù)返回客戶端并顯示當(dāng)前狀態(tài)的相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-02-02
Codeigniter實(shí)現(xiàn)多文件上傳并創(chuàng)建多個(gè)縮略圖
這篇文章主要介紹了Codeigniter實(shí)現(xiàn)多文件上傳并創(chuàng)建多個(gè)縮略圖,需要的朋友可以參考下2014-06-06
PHP常用算法和數(shù)據(jù)結(jié)構(gòu)示例(必看篇)
下面小編就為大家?guī)硪黄狿HP常用算法和數(shù)據(jù)結(jié)構(gòu)示例(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03
Laravel框架實(shí)現(xiàn)redis集群的方法分析
這篇文章主要介紹了Laravel框架實(shí)現(xiàn)redis集群的方法,簡(jiǎn)單分析了Laravel框架redis數(shù)據(jù)庫集群功能設(shè)置步驟、相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2017-09-09
PHP中__get()和__set()的用法實(shí)例詳解
在PHP5中,預(yù)定義了兩個(gè)函數(shù)“__get()”和“__set()”來獲取和賦值其屬性,對(duì)每個(gè)字段進(jìn)行set和get的操作。只需要加上兩個(gè)魔術(shù)方法即可2013-06-06

