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

如果图像已经存在,请使用PHP重命名图像,php,image,Php,Image,我正在开发一个使用图像的系统,图像由一封MD5ED电子邮件命名。我想在新上传的图片之后添加一个-1-2等,如果一个带有MD5ED电子邮件名称的图片已经存在。这是我的密码: public function upload() { global $email; $fileName = $_FILES['userfile']['name']; $tmpName = $_FILES['userfile']['tmp_name']; $fileSize =

我正在开发一个使用图像的系统,图像由一封MD5ED电子邮件命名。我想在新上传的图片之后添加一个-1-2等,如果一个带有MD5ED电子邮件名称的图片已经存在。这是我的密码:

    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
public function upload(){
全球$电子邮件;
$fileName=$_文件['userfile']['name'];
$tmpName=$\u文件['userfile']['tmp\u名称'];
$fileSize=$_文件['userfile']['size'];
$fileType=$_文件['userfile']['type'];
$user=$\会话['user'];
$fp=fopen($tmpName,'r');
$content=fread($fp,filesize($tmpName));
$content=addslashes($content);
fclose($fp);
如果(!get_magic_quotes_gpc()){
$fileName=addslashes($fileName);
}
$new_file_name=md5($email);
$fileExists=file_exists(“../lib/uploads/”$new_file_name);
$query=mysql\u query(“从化身中选择*,其中(名称=“$fileName”)或(名称=“$new\u文件名”);
$num\u rows=mysql\u num\u rows($query);
如果($fileExists){
$fileName=$new\u file\u name;
$first=1;
$separator='-';
而(文件_存在(“../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\u file\u name;
}elseif(空($fileName)){
echo“请先选择一个文件”;
}否则{
移动上传的文件($文件[“用户文件”][“tmp文件名”],
“lib/avatars/”$fileName);
echo“文件$fileName已上载。”;
}
}//结束upload()函数

但我不知道出了什么问题,它上传了带有原始名称的图像。即使以md5 ed电子邮件作为名称也不行。

简言之

你把你的if陈述搞砸了

详细信息

这很简单。在上一个else(当文件不存在时执行的else)中,您有

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

通过这种方式,您可以立即知道是否已经有使用此md5的文件,以及其中的数量。

简而言之

你把你的if陈述搞砸了

详细信息

这很简单。在上一个else(当文件不存在时执行的else)中,您有

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

通过这种方式,您可以立即知道是否已经有使用此md5的文件以及其中的数量。

现在它将使用md5上载该文件,但如果它已经存在,则不会在末尾添加-1。更改while函数以使用
$new\u file\u name
,因为这是您正在更新的变量:
while(file\u exists(../lib/uploads/)($new_文件名)){
中的所有$fileName都是一样的,而
则是这样。您正在更改
$new\u file\u name
变量,但您不断引用原始的
$fileName
,该变量仍然不变,并且包含实际的文件名,而不是md5。更新了我的答案。经过测试,有效。您只需要引用
$new\u file>_name
在您的regexps.Yup中是可以使用的。但是由于某些原因,它没有输入文件名,现在它会使用md5上传文件,但是如果它已经存在,它不会在末尾添加-1,而是更改while函数以使用
$new\u file\u name
,因为这是您正在更新的变量:
while(file\u exists(../lib/uploads/)($new_文件名)){
中的所有$fileName都是一样的,而
则是这样。您正在更改
$new\u file\u name
变量,但您不断引用原始的
$fileName
,该变量仍然不变,并且包含实际的文件名,而不是md5。更新了我的答案。经过测试,有效。您只需要引用
$new\u file>_name
在您的regexps.Yup中,这是可行的。但由于某些原因,它没有进入文件exists循环