如何在PHP中创建增量文件夹名称

时间:2020-04-09 01:11:32

标签: php html

我有一个包含三个输入的HTML表单:

  • 名称
  • 顾问ID(数字)
  • 图片上传

用户提交表单后,php脚本将:

  • 使用提交的名称创建文件夹
  • 在文件夹中创建一个txt文件,其中包含:名称+顾问ID(给定的编号)
  • 在文件夹中,存储用户上传的图像

我想要的最重要的是,将由php文件创建的文件夹增加1。我的意思是:folder1(txt文件+图像),folder2(txt文件+图像),folder3(txtfile +图像)和等等...

1 个答案:

答案 0 :(得分:0)

有几种不同的方法可以完成您描述的内容。当您尝试创建一个新文件夹并确定下一个最高编号时,一种选择是查看所有现有文件夹(目录)。

您可以通过在父输出目录上使用scandir来找到现有文件来实现此目的。

示例:

$max=0;
$files=scandir("/path/to/your/output-directory");
$matches=[];
foreach($files as $file){
    if(preg_match("/folder(\d+)/", $file, $matches){
        $number=intval($matches[1]);
        if($number>$max)
            $max=$number;
    }
}
$newNumber=$max+1;

这是一个简单的示例,可让您获得下一个号码。还有许多其他因素需要考虑。例如,如果两个用户同时提交表单怎么办?您将需要一些同步隐喻(例如信号量或文件锁定),以确保一次只能进行插入。

您可以使用一个单独的锁定文件来存储当前号码并用作同步方法。

我强烈建议您找到一种不同的方式来存储数据。使用数据库存储此数据可能是一个更好的选择。

如果需要将文件存储在本地磁盘上,则可以考虑使用其他选项来生成目录名称。例如,您可以使用时间戳,数据散列或它们的组合。您也许还可以通过uniqid之类的东西来度过难关。任何文件系统选项都需要某种形式的同步来解决竞争状况。

这是一个更完整的示例,该示例使用锁定文件进行顺序和同步来顺序创建目录。这省略了应为生产代码添加的一些错误处理,但应提供核心功能。

define("LOCK_FILE", "/some/file/path"); //A file for synchronization and to store the counter
define("OUTPUT_DIRECTORY", "/some/directory"); //The directory where you want to write your folders

//Open the lock file
$file=fopen(LOCK_FILE, "r+");
if(flock($file, LOCK_EX)){
    //Read the current value of the file, if empty, default to 0
    $last=fgets($file);
    if(empty($last))
        $last=0;
    //Increment to get the current ID
    $current=$last+1;
    //Write over the existing value(a larger number will always completely overwrite a smaller number written from the same position)
    rewind($file);
    fwrite($file, (string)$current);
    fflush($file);
    //Determine the path for the next directory
    $dir=OUTPUT_DIRECTORY."/folder$current";
    if(file_exists($dir))
        die("Directory $dir already exists. Lock may have been reset");
    //Create the next directory
    mkdir($dir);
    //TODO: Write your content to $dir (You'll need to provide this piece)
    //Release the lock
    flock($file, LOCK_UN);
}
else{
    die("Unable to acquire lock");
}
//Always close the file handle
fclose($file);