我正在使用一个使用图像的系统,图像由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电子邮件作为名称。
答案 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的文件以及有多少文件。