【问题标题】:PHP: define name for file uploadPHP:定义文件上传的名称
【发布时间】:2014-08-29 07:41:49
【问题描述】:

我有一段代码可以将配置文件图像存储在地图“images/profiles”中,并将 URL 存储在数据库中。我想将上传的个人资料图片的名称定义为用户的 $ID。我该怎么做?

include("../../core/init.inc.php");

$target = "../images/profiles/";
$target = $target . basename($_FILES['photo']['name']);

$pic = $_FILES['photo']['name'];

if(move_uploaded_file($_FILES['photo']['tmp_name'], $target)) {
    echo "The file ". basename($_FILES['photo']['name']). " has been uploaded";
} else {
    echo "ERROR";
}

mysql_query("UPDATE users SET image_url='includes/images/profiles/$pic' WHERE username = '".mysql_real_escape_string($_SESSION['username'])."'");

现在,当有人上传他的个人资料图片(我们称之为 pf1.png)时,它会将其保存为“pf1.png”。我希望它像“$ID.png”一样保存(.png 是一个随机扩展名)。我想为 move_upload_file 函数和正确更新 'image_url' 数据库列完成此操作。

【问题讨论】:

  • 你为什么不逃避 $pic。他们不能上传 DROP DATABASE.png
  • 你有$target - 这就是你必须改变的。请注意,您很容易受到sql injection attacks 的攻击并使用过时/弃用的数据库接口。

标签: php mysql file-upload path user-profile


【解决方案1】:

根据文档中的示例,您可以在move_uploaded_file() 的目标中提供文件名。如果失败,您可以在保存文件后简单地rename()

【讨论】:

    【解决方案2】:

    尝试改变

    $target = $target . basename($_FILES['photo']['name']);
    

    到:

    $filename=$_FILES["file"]["tmp_name"];
    $extension=end(explode(".", $filename));
    $target = target . $_SESSION["ID"].".".$extension;  
    

    旁注:您没有转义 $pic 这会使您的网站容易受到 sql-injection 的攻击

    【讨论】:

      【解决方案3】:

      我不知道您如何保存用户的 ID,但为了方便起见,我们假设您将 ID 存储在会话中。

      然后只需更改 $target。

      $target = $target . $_SESSION['ID'];
      

      另外更改您的查询如下:

      $url = "includes/images/profiles/" . $_SESSION['ID'];
      
      SET image_url="$url"
      

      注意:我不知道您为什么在包含文件夹中包含一个图像文件夹,但我猜您是自己做出的选择。

      【讨论】:

        【解决方案4】:

        您可以获取最后插入的 id 并将其作为图像/上传文件的名称

        $qry = mysqli_query($dbconnection,"INSERT INTO statements here");
        $last_id = mysqli_insert_id($dbconnection);
        
        //$ext= you get the extension of the file uploaded
        
        move_uploaded_file($tmpname,$target.$last_id.$ext);
        

        现在,如果您希望它也可以在更新中完成。

        您始终可以获取要获取的数据的 ID,并将其作为更新的基础。

        例如

        $id = $_GET['id'] || $id = $row['id']; //anything depends on how you want it to retrieve
        

        那么你就可以做查询和move_uploaded_file函数了

        $qry = mysqli_query($dbconnection,"UPDATE tblname SET field='$anything' WHERE id = '$id'");
        move_uploaded_file($tmpname,$target.$id.$ext);
        

        当然 $tmpname 将是您上传的文件的基础,$tmpname 将是您要移动到所需目录的文件

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-13
          • 2013-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多