如果文件已存在,则重命名文件

Posted

技术标签:

【中文标题】如果文件已存在,则重命名文件【英文标题】:Rename a file if same already exists 【发布时间】:2014-07-20 18:04:11 【问题描述】:

我正在尝试上传一个文件并重命名它(如果它已经存在)。 我希望我这样做的方式是,当 det 相同的文件上传时,名称只需添加 1,然后是 2,然后是 3,依此类推。

示例:如果文件“file”存在,则新文件应该是“file1”,然后是下一个“file2”。

我在网上看到了一些示例,但我认为没有适合我的代码的示例(菜鸟)

这是我现在的代码:

$id = $_SESSION['id'];
$fname = $_FILES['dok']['name'];
if ($_FILES['dok']['name'] !="")
// Checking filetype
if($_FILES['dok']['type']!="application/pdf")     die("You can only upload PDF files");

// Checking filesize
if ($_FILES['dok']['size']>1048576) die("The file is too big. Max size is 1MB");

// Check if user have his own catalogue
if (file_exists("filer/".$id."/")) 
// Moving the file to users catalogue
move_uploaded_file($_FILES['dok']['tmp_name'],"filer/".$id."/".$fname);

//If user don't have his own catalogue 
else 
// Creates new catalogue then move the file in place
mkdir("filer/".$id);
move_uploaded_file($_FILES['dok']['tmp_name'],"filer/".$id."/".$fname);    

有人可以帮我在哪里输入解决此问题的代码吗? 非常感谢!

【问题讨论】:

你自己有没有尝试过? 您的代码非常危险。您直接使用 USER 提供的['name'] 参数作为文件在服务器上的最终位置。恶意用户可以嵌入路径信息并使用您的脚本在服务器上随意书写他们想要的任何文件。您的['type'] 支票不是安全性。没用的。 mime 类型很容易伪造。 是的,我实际上尝试了一堆,但由于我很新,所以并没有让它工作,我扼杀了编辑代码并使其适合我的.. 【参考方案1】:

所以如果文件夹存在:

file_exists("filer/".$id."/")

检查文件是否存在

file_exists("filer/".$id."/".$fname)

如果是的话,

$fname = $fname . "(1)" // or some appending string

所以最后你将代码更改为:

// Check if user have his own catalogue
if (file_exists("filer/".$id."/")) 
    while (file_exists("filer/".$id."/".$fname)) // Now a while loop
        $fname = "copy-" . $fname; // Prepending "copy-" to avoid breaking extensions

    // Moving the file to users catalogue
    move_uploaded_file($_FILES['dok']['tmp_name'],"filer/".$id."/".$fname);

//If user don't have his own catalogue 
else 

【讨论】:

这使得文件名在它之后得到一个(1),但是它停在那里,如何让它跟进?其次,现在文件类型发生了变化,因为它是一个 .pdf 文件。最初是“file”的名称现在变成了“file.pdf1”,这使得它不可读 我认为这涵盖了这两个问题 如果存在大量重复文件,这可能会导致问题,因为文件名会变得很大。我不知道文件名的操作系统限制是什么,但我认为它们存在于大多数操作系统上。许多服务通过在文件名之外使用时间戳/UUID 来避免这种复杂性。【参考方案2】:
$id = $_SESSION['id'];
$fname = $_FILES['dok']['name'];
if ($_FILES['dok']['name'] !="")
    // Checking filetype
    if($_FILES['dok']['type']!="application/pdf") 
        die("You can only upload PDF files");
    
    // Checking filesize
    if ($_FILES['dok']['size']>1048576) 
        die("The file is too big. Max size is 1MB");
    

    if(!is_dir("filer/".$id."/")) 
        mkdir("filer/".$id); 
    

    $rawBaseName = pathinfo($fname, PATHINFO_FILENAME );
    $extension = pathinfo($fname, PATHINFO_EXTENSION );
    $counter = 0;
    while(file_exists("filer/".$id."/".$fname)) 
        $fname = $rawBaseName . $counter . '.' . $extension;
        $counter++;
    ;

    move_uploaded_file($_FILES['dok']['tmp_name'],"filer/".$id."/".$fname);  

 

但不要忘记保护您的脚本(例如,请参阅上面 Marc B 的评论),也许您可​​以进行更多优化 ;-)

【讨论】:

第一次很好,加了一个0,但第二次只是加载,等待本地主机..这是错误:致命错误:最大执行时间超过30秒(while(file_exists ("filer/".$id."/".$fnavn)) $fnavn = $rawBaseName . $counter . '.' . $extension;; )【参考方案3】:
<form action="test.php" method="post" enctype="multipart/form-data">
Select file to upload:
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload File" name="submit">
</form>

<?php
$id = $_SESSION['id'];
$fname = $_FILES['fileToUpload']['name'];
 // Checking filesize
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], "uploads/".$id."/".$fname)) 
    echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
else 
    echo "Sorry, there was an error uploading your file.";

// Check file size$
if ($_FILES['fileToUpload']['size']>1048576) 
    die("The file is too big. Max size is 1MB");

if(!is_dir("uploads/".$id."/")) 
    mkdir("uploads/".$id); 


$rawBaseName = pathinfo($fname, PATHINFO_FILENAME );
$extension = pathinfo($fname, PATHINFO_EXTENSION );
$counter = 0;
while(file_exists("uploads/".$id."/".$fname)) 
    $fname = $rawBaseName . $counter . '.' . $extension;
    $counter++;
;

move_uploaded_file($_FILES['fileToUpload']        ['tmp_name'],"uploads/".$id."/".$fname);  
?>

【讨论】:

一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。

以上是关于如果文件已存在,则重命名文件的主要内容,如果未能解决你的问题,请参考以下文章

重命名文件(如果已存在)-php 文件上传

复制文件重命名(如果已存在)PowerShell

重命名文件时忽略错误 58

重命名两个目录中的文件名如果它们之间的某些字符匹配 - 矢量下标超出范围

如何删除sqlserver实例

php检查文件名是不是存在,重命名文件