move_uploaded_file()不会替换现有图像

时间:2012-03-25 08:37:37

标签: php

我正在使用下面的脚本,因此用户可以上传他们的个人资料照片。第一次上传图像(当图像不存在于该位置时),它的效果很好。但是,如果图像已存在于路径中(如果用户尝试更改配置文件图片),则新图像将不会替换旧图像。我确实获得了查询的成功。

任何帮助都将非常感谢!

由于

<?php

ini_set('display_errors',1);

 error_reporting(E_ALL);


require_once('db.php'); 


$name = $_POST['name']; 

   $dir = '../uploadImages/'; 
   $file = basename($_FILES['image']['name']);

   $uploadfile = $dir . $file;


    if(move_uploaded_file($_FILES['image']['tmp_name'], $uploadfile))
    {


        $path = $name; 
        $path .= 'Image.png';       
        $query = mysql_query("UPDATE users SET imagePath='$path' WHERE username='$name'");

        if ($query)
        {
            echo 'success'; 
        }
        else 
        {
            echo 'error'; 
        }


    }
    else 
    {
        echo mysql_error(); 
    }


 ?>

5 个答案:

答案 0 :(得分:26)

更好的方法是取消链接文件(如果存在)

if(file_exists('your-filename.ext')) {
    chmod('your-filename.ext',0755); //Change the file permissions if allowed
    unlink('your-filename.ext'); //remove the file
}

move_uploaded_files($_FILES['image']['tmp_name'], 'your-filename.ext');

答案 1 :(得分:4)

如果move_uploaded_file失败,则返回false。在这种情况下,根本不执行任何SQL,因此在mysql_error分支中回显的else确实不会输出错误。

如果move_uploaded_file失败,它会发出警告,该警告将根据您的PHP设置显示。但是,这个问题与MySQL没有任何关系。

如果您尝试首先显式删除目标文件,如果它存在。选中file_exists,然后使用unlink删除该文件。如果unlink失败,则可能是权限问题,而不允许您删除或覆盖该文件。

答案 2 :(得分:2)

不,你的逻辑错了。看看你的个人资料图片的网址,无论是在这里,还是在facebook或twitter ..你看到他们使用固定的可预测名称吗?他们没有,并且有一个很好的理由,你需要独特的,不可预测的文件名。

试试这个:

$file = hash('sha256', openssl_random_pseudo_bytes(8)) . 'yourallowedextension';

然后从数据库中查询旧图片的名称,之后,上传新图片,如果成功,则更新数据库中用户的个人资料图片,并使用先前获得的信息(如果有)取消链接()旧文件。

确保您不允许上传php文件或任何其他令人讨厌的东西,因为您可以使用php fileinfo扩展。

答案 3 :(得分:1)

$file=$_FILES['image']['name'];
$path="your/location/".$file;
if(file_exists($path) 
{
  chmod($path,0755); 
  unlink($path);
}

然后移动文件。

答案 4 :(得分:0)

如果这样做,新图像将被替换:

$sourcePath = $_FILES['image']['tmp_name'];
list($width,$height)=getimagesize($sourcePath);
$uploadedImage = imagecreatefromjpg($sourcePath);
$newImage=imagecreatetruecolor($newWidth,$newHeight); 
imagecopyresampled($newImage,$uploadedImage,0,0,0,0,$newWidth,$newHeight,$width,$height);
imagejpeg($newImage, $destinationPath,100);