【问题标题】:How to rename a file if the name already exists?如果名称已经存在,如何重命名文件?
【发布时间】:2023-04-06 22:38:01
【问题描述】:

我正在使用以下脚本。它基本上检查正在上传的文件的名称是否已经存在,如果存在,则应将其重命名为其他名称并上传。到目前为止,它不起作用。要么它重命名所有文件,要么当我尝试通过网页打开文件时,它说文件损坏。

代码:

$sql="SELECT filename FROM doc_u WHERE person_id= '$pid'";  

    $result=mysql_query($sql);

    $query = mysql_query($sql) or die ("Error: ".mysql_error());

 if ($result == "")
 {
 echo "";
  }
   echo "";


    $rows = mysql_num_rows($result);

    if($rows == 0)
    {
   print("");

    }
    elseif($rows > 0)
    {
   while($row = mysql_fetch_array($query))
    {

   $existing = $row['filename'];

   print("");
   }

   }

     if ( $filename === $existing ) {
$filename = $uniqueidgenerator.strrchr($_FILES['filename']['name'], ".");

    } else {
     $filename = $_FILES['filename']['name'];;
    }

//After checking it will move the files

      if(move_uploaded_file($_FILES['filename']['tmp_name'],$upload_path . $filename))
     echo ''; 
  else
     echo ''; 

【问题讨论】:

    标签: php file


    【解决方案1】:

    鉴于您已经在使用数据库,让我尽可能简单地说:永远不要使用用户提供的文件名。相反,通过其对应的数据库记录的主键 ID 号存储每个上传的文件(您正在使用自动递增的整数作为 id,对吗?)。将文件名存储在数据库中,现在您可以拥有任意数量的“text.txt”文件,因为每个实际文件将被命名为“1”、“53”和“207”等...

    【讨论】:

    • 这很重要。如果您让某人将 somejpeg.php 上传到您的服务器,它可以验证为 jpeg,但其内部仍然存在恶意代码。基本上有人可以使用这种方法接管你的服务器。
    • 当然,您只需通过 PHP 提供文件并输出 header('Content-disposition: attachment; filename=ORIGINAL_FILENAME_HERE');,用户将永远不会看到它在您的服务器上真正称为“207”。
    • @KPO 另一种选择是他们入侵您的系统。但是,您可以设置自己的文件服务器,以确保它们无法在您的服务器上执行代码。基本上,您将拥有一个 download.php?id=n 脚本,可以让他们访问他们上传的任何文件,并将其设置回其原始名称。该脚本将使用标题设置下载的文件名,然后回显文件的内容。
    • 数据库中的 auto_increment 主键字段不应生成重复的 id。如果是这样,那你就有大问题了
    • @KPO,您的数据库将具有可用于文件名的自动递增 id 字段。这将确保您永远不会有重复的文件名。
    【解决方案2】:

    这里没有太多代码可以继续。我怀疑$filename 没有正确初始化。因此,在您的 if ( $filename === $existing ) 中,这确实是在说 if(undefined === undefined),这始终是正确的。

    我不明白为什么文件会损坏。这可能是一个完全不同的问题。

    另外,请注意那里的 sql 语句。那是等待发生的 SQL 注入。如果您使用准备好的语句或至少使用mysql_escape_string,那会好很多。当然,这已被弃用,有利于准备好的语句。

    更好的工作流程是先在数据库中插入一行文件的元数据,然后使用您返回的主键重命名文件。它保证永远是唯一的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-14
      • 2018-08-02
      • 2014-05-18
      • 2012-04-02
      • 1970-01-01
      • 2019-07-25
      • 2013-09-29
      • 2015-02-02
      相关资源
      最近更新 更多