0

我正在开发一个使用图像的系统,并且图像由 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 电子邮件作为名称。

4

1 回答 1

3

简而言之

你搞砸了你的 if 语句

详细地

这非常非常非常简单。在你的最后一个 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

如何优化它

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

否则,在上传第 10、20 张照片后,您很快将不得不等待很长时间。

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

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

通过这种方式,您可以立即知道是否已经存在具有此 md5 的文件以及其中有多少。

于 2013-06-16T13:26:20.433 回答