php文件上传不要替换旧的[重复]

Posted

技术标签:

【中文标题】php文件上传不要替换旧的[重复]【英文标题】:php file upload do NOT replace old one [duplicate] 【发布时间】:2016-11-23 07:31:46 【问题描述】:

我不擅长 php 编码,谁能帮我这个 php 上传代码。

我有用于将文件上传到服务器的 php 文件完美运行,但我的问题是它将替换旧文件。我不想替换旧的,例如如果文件存在上传文件重命名(文件到文件_1)。

<?php

$target_path1 = "uploads/";
/* Add the original filename to our target path. Result is "uploads/filename.extension" */
$target_path1 = $target_path1 . basename($_FILES['uploaded_file']['name']);

if (move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $target_path1)) 

    echo "The first file " . basename($_FILES['uploaded_file']['name']) . " has been uploaded.";
 else 
    echo "There was an error uploading the file, please try again!";
    echo "filename: " . basename($_FILES['uploaded_file']['name']);
    echo "target_path: " . $target_path1;


?>

我会感谢你的帮助...

【问题讨论】:

您应该绝对验证您的用户输入。这段代码看起来任何人都可以上传.php-文件,通过浏览器访问它并运行任意命令并危及您的服务器来执行它。 在上传之前检查文件是否已经存在。将计数器值附加到新文件的文件名。 【参考方案1】:

你可以试试这个

if(!file_exists("folder/".$_FILES["file"]["name"]))
       $file = "folder/".$_FILES["file"]["name"];
       if(move_uploaded_file($tmp_name, $file));
        "your message"
       
  else 
        $file = "your folder/01_".$_FILES["file"]["name"];
        if(move_uploaded_file($tmp_name, $file));
         "your message"
    
   

你也可以使用 rand() 函数来重命名

【讨论】:

【参考方案2】:

上传文件时用 if 或 while 检查条件。if (file_exists("YOUR-FOLDER/" . $_FILES["file"]["name"])) //code to rename your file name. Use time() or rand() etc...

【讨论】:

感谢您的帮助,但不幸的是我无法使用我的代码进行配置 把你的完整代码贴在这里,我去看看。【参考方案3】:

我认为有两种解决方案适合您 如果您只想要新文件名,您可以在文件名末尾添加时间

if( isset($_FILES['uploaded_file']['name']) && !empty($_FILES['uploaded_file']['name']) )
    $tFile = $_FILES['uploaded_file'];
    $fileName=time().$tFile['name'];
    $mn_dir='your folder location'.$fileName ;
    if( !@move_uploaded_file( $tFile['tmp_name'] , $mn_dir) )
        return true
    else
        return false
    

但如果你想检查文件是否存在

if( file_exists("Your Folder/".$_FILES['uploaded_file']['name']) )
    // you can add number to file , I think you should add tile because file_1 and file_2 , ... may be exist

    $tFile = $_FILES['uploaded_file'];
    $fileName=time().$tFile['name'];
    $mn_dir='your folder location'.$fileName ;
    if( !@move_uploaded_file( $tFile['tmp_name'] , $mn_dir) )
        return true
    else
        return false
    

else
    // upload the file

【讨论】:

感谢伙伴的帮助,但我无法成功。我必须将所有代码添加到 else 语句中吗?【参考方案4】:

使用php函数isfile检查你的文件

if (!is_file('uploads/'.$_FILES['uploaded_file']['tmp_name'])) 
    move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $target_path1);

或 你可以rename你的文件名使用uniqueid

【讨论】:

感谢您的重播,我已经测试过您的代码没有任何变化。 它将取代旧的【参考方案5】:

做一个类似的函数

public function getUniqueName($path, $name) 
    $name = str_replace(" ", "_", mb_eregi_replace('\s+', ' ', $name));

    $i = 0;
    $uniqueName = $name;
    while (file_exists("$path/$uniqueName")) 
        $i++;
        $uniqueName =  $name . $i;
    
    return $uniqueName;

在上传文件之前,请通过该函数获取唯一名称。希望对您有所帮助。

【讨论】:

以上是关于php文件上传不要替换旧的[重复]的主要内容,如果未能解决你的问题,请参考以下文章

上传文件PHP时生成唯一文件名的最佳方法[重复]

PHP Ajax文件上传不起作用[重复]

请不要用php进行base64编码文件上传

PHP 文件上传不读取 $_FILES['image'] [重复]

如何在php中限制表单提交的文件上传大小[重复]

在PHP中获取上传文件扩展名的最佳方法/实践是啥[重复]