【问题标题】:move_uploaded_file() won't replace existing imagemove_uploaded_file() 不会替换现有图像
【发布时间】:2020-05-18 16:09:51
【问题描述】:

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

任何帮助将不胜感激!

谢谢

<?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(); 
    }


 ?>

【问题讨论】:

  • 您是通过上传创建第一张图片还是自己创建文件?如果是后者,可能是权限问题。
  • 其实现在想想,看看你的PHP版本。我在几年前提交了一个关于这个问题的错误,我知道它已经很多年没有修复了,所以它可能仍然没有,或者你可能使用了一个没有修复的版本。
  • 如果无法移动文件,为什么还要使用mysql_error()?当时没有做任何mysql查询……
  • 您是否先尝试删除现有文件?

标签: php


【解决方案1】:

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

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');

【讨论】:

  • 不一定更好。 move_uploaded_file 应该自己做这个
  • 函数未调用 unlink_duplicate_file_then_move_uploaded_file
【解决方案2】:

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

如果move_uploaded_file 失败,它会发出警告,根据您的 PHP 设置,该警告将变得可见。但是,这个问题与 MySQL 无关。

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

【讨论】:

    【解决方案3】:

    不,您的逻辑是错误的.. 看看您的个人资料图片的 URL,无论是在此处,在 facebook 或 twitter 中..您是否看到他们使用固定的可预测名称?他们没有,而且有一个很好的理由,您需要唯一的、不可预测的文件名。

    试试这个:

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

    然后从您的数据库中查询旧图片的名称,然后上传新图片,如果成功,则更新数据库中的用户头像,并使用之前获得的信息 unlink() 旧文件(如果有)。

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

    【讨论】:

      【解决方案4】:
      $file=$_FILES['image']['name'];
      $path="your/location/".$file;
      if(file_exists($path)) 
      {
        chmod($path,0755); 
        unlink($path);
      }
      

      然后使用move_uploaded_file() 移动文件。

      【讨论】:

      • 你错过了一个括号:)file_exists 函数之后。
      【解决方案5】:

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

      $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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-31
        • 1970-01-01
        • 1970-01-01
        • 2017-07-09
        • 1970-01-01
        相关资源
        最近更新 更多