多次将同一文件复制到其他文件夹

时间:2019-06-19 09:11:15

标签: php

当我单击提交按钮时,我使用此脚本将文件复制到其他文件夹

<?php
if (isset($_POST['upload']) && isset($_POST['datae'])) {
copy('../print/'.$_POST['datae'], '../Upload/'.$_POST['datae']);
echo "<meta http-equiv='refresh' content='1'>";
}
?>

现在我想知道如果我选择相同的文件名并提交两次或多次。通常,我已经选择的文件名将复制并覆盖已经存储在其中的文件。

但是我想要的是每当我提交两次以上的目标文件夹中的文件时,它不会替换或覆盖,但会复制相同的文件,只是文件名不同,例如

//example in my folder
img_7878.JPG
img_7878_copy1.JPG
img_7878_copy2.JPG

也许我可以从这里获得帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用uniqid functionpathinfo function。像这样(未经测试):

if (isset($_POST['upload']) && isset($_POST['datae'])) {
    $uploadPath = '../Upload/' . $_POST['datae'];
    if (file_exists($uploadPath)) {
         $pathInfo = pathinfo($uploadPath);
         $uniqueId = uniqid('_copy_');
         $uploadPath = $pathInfo['dirname'] . '/' . $pathInfo['filename'] . $uniqueId . '.' . $pathInfo['extension'];
    }
    copy('../print/'.$_POST['datae'], $uploadPath);
}

您的代码中还存在一个潜在漏洞:有人可以使用post参数创建任何路径,例如:

$_POST['datae'] = '../../../env_file_with_passwords_file_from_protected_dir'

为避免这种情况,请阅读this doc article。在您的情况下,您可以检查文件名,以确保有人不会试图窃取您的文件:

if (isset($_POST['upload']) && isset($_POST['datae']) && preg_match('/^[a-z0-9_]+\.[a-z0-9_]+$/i', $_POST['datae'])) {
    copy('../print/'.$_POST['datae'], '../Upload/'.$_POST['datae']);
    echo "<meta http-equiv='refresh' content='1'>";
}

答案 1 :(得分:0)

您应该在点上分割文件名以单独获取扩展名,然后可以使用while循环更改目标名,直到找不到用于目标名的文件。

接下来,请勿执行以下操作:{{1} 使用Location.reload(); https://developer.mozilla.org/en-US/docs/Web/API/Location/reload

echo "<meta http-equiv='refresh' content='1'>";