2010-12-23 89 views
0

嗨,我想上传服务器上的图像,我已经做到了,但问题是,当我上传图像的相同名称,它给了我错误,我想做什么来追加一些东西到图像的结尾名称,以便每个图像都有其自己的唯一 名称。在php中更改图像名称

$TARGET_PATH =$TARGET_PATH . basename($_FILES['photo']['name']); 
if (file_exists($TARGET_PATH)) 
{ 
    // here will be the appended term 
}
+1

究竟是什么问题? – 2010-12-23 10:22:52

回答

1

你应该这样做:

$TARGET_PATH =$TARGET_PATH . basename($_FILES['photo']['name']); 
while (file_exists($TARGET_PATH)) 
{ 
    $TARGET_PATH =$TARGET_PATH . basename($_FILES['photo']['name'],'.jpg') . uniqid() . '.jpg'; 
} 

这样,它总是会产生一个唯一的文件名。注意这将适用于扩展名为jpg的文件。如果你想使用它的其他文件,那么我会推荐这个:

$TARGET_PATH =$TARGET_PATH . basename($_FILES['photo']['name']); 
$ext = pathinfo($_FILES['photo']['name'], PATHINFO_EXTENSION); 

    while (file_exists($TARGET_PATH)) 
    { 
     $TARGET_PATH =$TARGET_PATH . basename($_FILES['photo']['name'],'.' .$ext) . uniqid() . '.'.$ext; 
    } 

提供扩展名为basename将从名称中删除扩展名。 添加uniqid()会将一些独特的熵添加到文件名的末尾。如果这对你来说太长了,你可以用rand(0,10)替换它;

此方法还具有只有在发现文件确实存在时才执行的优点,否则将无法运行。

+0

感谢您的回复,但请你解释一下uniqid()和rand(0,10)的用法; rand方法只取0和10的限制......? – hunter 2010-12-23 10:38:55

+0

那么这只取决于你想要文件名的时间。 Uniqid()产生一个唯一的标识符并且会很长。 Rand(0,10)将产生一个介于0和10之间的数字。在这两种方法之间,uniqid文件不存在的概率要高得多。 rand(0,10)可能会导致应用程序崩溃,导致堆栈溢出,因为如果已经有10个文件名称完全相同,则循环永远不会结束。这真的归结于你怀疑你的应用程序将被使用。您也可以用“time()”函数替换它。 – Jason 2010-12-26 02:14:44

0

想想返回唯一名称的功能 - 样(未经测试,是非常可改进):

<?php 
// ... 
function getUniqueFilename($targetPath = '.', $extension = 'jpg') { 
    $uniqueFilename = sha1(time() . mt_rand(1, 150)) . '.'. $extension; 

    if(file_exists($targetPath . $uniqueFilename)) { 
    getUniqueFilename($targetPath, $extension); 
    } else { 
    return $uniqueFilename; 
    } 
} 

// and you call it like 
$newFilename = getUniqueFilename('.', 'gif'); 
?> 

就像一个想法;-)

+0

是的,但是,这似乎相当cpu密集这样一个简单的任务,你不觉得吗? – Jason 2010-12-23 10:28:23

3

你不应该得到的错误,当一个文件已经存在相同的名称。 我认为你的问题应该是别的。

但如果更改名称只是解决您的问题也可以使用时间戳并将其添加到您的文件名是唯一的。

function uniqueName($filename){ 
    $f = explode('.', $filename); 
    $ext = $f[count($f)-1]; 
    return implode('.', $f).time().'.'.$ext; 
} 

此函数将适用于所有扩展。