我开发了一个用户可以登录和上传文件的表单,但我们遇到了一个问题,如果文件名是相同的,它会覆盖。
所以我想要实现的是上传文件,重命名文件或在文件名中添加其他字符,请参阅下面的代码。
if ($_GET['ul'] == 1) {
$target_path = "../uploads/documents/";
$target_path = $target_path . basename( $_FILES['uploadfile1']['name']);
$fname = $_FILES['uploadfile1']['tmp_name'];
$filename = $_FILES['uploadfile1']['name'];
$extensions = array('xls','pdf','PDF','doc','DOC','docx','DOCX','jpg','JPG','xlsx');
$extension = strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) );
if (in_array($extension, $extensions)) {
move_uploaded_file($fname, $target_path);
echo $filename;
} else {
echo 'Sorry this file type cant be uploaded.';
}
}
答案 0 :(得分:3)
为了解决这个问题,我们可以生成新文件名,该名称对于保存文件是唯一的。如果我们转换当前日期&使用strtotime()的时间,生成的字符串将是唯一的,并且没有机会获得重复的文件名。我们可以保存具有该名称的文件
if ($_GET['ul'] == 1) {
$target_path = "../uploads/documents/";
$fname = $_FILES['uploadfile1']['tmp_name'];
$filename = $_FILES['uploadfile1']['name'];
$extensions = array('xls','pdf','PDF','doc','DOC','docx','DOCX','jpg','JPG','xlsx');
$extension = strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) );
if (in_array($extension, $extensions)) {
$tempname = strtotime(date("Y-m-d H:i:s"));
$temp =explode(".",$fname);
$target_path = $target_path.$tempname.'.'.$temp[1];
move_uploaded_file($fname, $target_path);
echo $filename;
} else {
echo 'Sorry this file type cant be uploaded.';
}
}
答案 1 :(得分:3)
你可以做这样的事情
$f_name = $_FILES['uploadfile1']['name'];
$f_extension = explode('.', $f_name); //To breaks the string into array
$f_extension = strtolower(end($f_extension)); //end() is used to retrun a last element to the array
$f_newfile = uniqid() . '.' . $f_extension; // / It`s use to stop overriding if the image will be same then uniqid() will generate the unique name of both file.
答案 2 :(得分:3)
您可以添加时间戳来区分文件名
$f_extension_array = explode('.', $f_name);
$f_extension = strtolower($f_extension_array[1]);
$fname = $f_extension_array[0] . '_' . time() . '.' . $f_extension;
OR
repetitions <- function(x) {
x[x == lag(x) & !is.na(x) & !is.na(lag(x))] <- x[x == lag(x) & !is.na(x) & !is.na(lag(x))] + (0.0001*sd(x, na.rm = T))
x
}
ITA_HD6 <- data.frame(apply(ITA_HD5, 2, repetitions))
答案 3 :(得分:1)
使用time()函数在文件名中附加时间戳,因为你可以从time()获得唯一值:
所以它会像:
$filename = time()."_".$_FILES['uploadfile1']['name'];
答案 4 :(得分:1)
为了防止文件被另外覆盖,我总是使用uniqid()
功能。这个PHP函数生成一个唯一的id。如果您将此ID附加到您的文件名,您将永远不会覆盖其他文件。
$filename = $filename.uniqid().$extension;
答案 5 :(得分:0)
您可以使用jQuery-MD5插件创建和使用文件名和时间的十六进制md5:
$(function () {
$fname = 'file number 3.doc';
$fname = $.md5($fname + Date.now()) + '_' + $fname;
$('#logMsg').append('<p>' + $fname + '</p>');
});
<script src="https://code.jquery.com/jquery-1.12.3.min.js"></script>
<script src="https://rawgit.com/placemarker/jQuery-MD5/master/jquery.md5.js"></script>
<div id="logMsg"></div>