当我单击提交按钮时,我使用此脚本将文件复制到其他文件夹
<?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
也许我可以从这里获得帮助。
答案 0 :(得分:1)
您可以使用uniqid function和pathinfo 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'>";