如果图像已存在,则使用PHP重命名图像

时间:2013-06-16 13:17:23

标签: php image

我正在使用一个使用图像的系统,图像由md5-ed电子邮件命名。如果已存在具有md5-ed电子邮件名称的图像,我想在新上传的图像后添加-1 -2等。这是我的代码:

    public function upload() {  

    global $email;

    $fileName = $_FILES['userfile']['name'];
    $tmpName  = $_FILES['userfile']['tmp_name'];
    $fileSize = $_FILES['userfile']['size'];
    $fileType = $_FILES['userfile']['type'];
    $user     = $_SESSION['user'];

    $fp      = fopen($tmpName, 'r');
    $content = fread($fp, filesize($tmpName));
    $content = addslashes($content);
    fclose($fp);

    if(!get_magic_quotes_gpc()) {
        $fileName = addslashes($fileName);
    }

    $new_file_name = md5($email);


    $fileExists = file_exists("../lib/uploads/" . $new_file_name);

    $query = mysql_query("SELECT * FROM avatars WHERE ( name='$fileName' ) OR ( name='$new_file_name' ) ");

    $num_rows = mysql_num_rows($query);


    if ( $fileExists ) {

        $fileName = $new_file_name; 
        $first = 1;
        $separator = '-';

        while ( file_exists("../lib/uploads/" . $fileName) ) {

            preg_match('/(.+)'.$separator.'([0-9]+)$/', $fileName, $match);     

            $new_file_name = isset($match[2]) ? $match[1].$separator.($match[2] + 1) :$fileName.$separator.$first;

            $first++;   

        }

        $fileName = $new_file_name;

    } elseif ( empty( $fileName ) ) {

        echo '<div class="error">Please Select a file first.</div>';

    } else {

        move_uploaded_file($_FILES["userfile"]["tmp_name"],
          "lib/avatars/" . $fileName);

        echo "<div class='success'>File $fileName Uploaded.</div>";  

    }

} // ends upload() function

但我不知道出了什么问题,它会用原始名称上传图片。甚至没有使用md5-ed电子邮件作为名称。

1 个答案:

答案 0 :(得分:3)

简而言之

你搞砸了你的if语句

详细

这非常简单。在你的最后一个(文件不存在时执行的那个)你有

move_uploaded_file($_FILES["userfile"]["tmp_name"],
      "lib/avatars/" . $fileName);

但是如果你追溯,你会看到$fileName设置为

$fileName = $_FILES['userfile']['name'];

而不是电子邮件的md5。您必须删除最终的else条件,并且每次都执行其代码。当然,只要$fileName不为空。

所以您的代码应为:

if ( $fileExists ) {

    $fileName = $new_file_name; 
    $first = 1;
    $separator = '-';

    while ( file_exists("../lib/uploads/" . $new_file_name ) ) {

        preg_match('/(.+)'.$separator.'([0-9]+)$/', $new_file_name, $match);    

        $new_file_name = isset($match[2]) ? $match[1].$separator.($match[2] + 1) :$new_file_name.$separator.$first;      
        $first++;   

    }
} 

// <----
// Moved this one outside, since it always executes
// ---->
$fileName = $new_file_name;

// <----
// Separated this if, since it has nothing to do with the above
// ---->
if ( empty( $fileName ) ) {

    echo '<div class="error">Please Select a file first.</div>';

} else {

    move_uploaded_file($_FILES["userfile"]["tmp_name"],
      "lib/avatars/" . $fileName);

    echo "<div class='success'>File $fileName Uploaded.</div>";  

}

} // ends upload() function

如何优化

这取决于您是否希望单个用户拥有大量图片。如果不是这种情况,请保持原样。

否则,您很快就会在上传第10张,第20张照片后等待很长时间。

改进它的一种方法是在适合模式的目录中搜索文件(在本例中为md5)。例如:

foreach (glob($md5 . "*") as $filename) {
    echo "$filename size " . filesize($filename) . "\n";
}

通过这种方式,您可以立即知道是否已有使用此md5的文件以及有多少文件。