如何在文件名中添加随机字母?

时间:2016-04-29 09:43:26

标签: php

我开发了一个用户可以登录和上传文件的表单,但我们遇到了一个问题,如果文件名是相同的,它会覆盖。

所以我想要实现的是上传文件,重命名文件或在文件名中添加其他字符,请参阅下面的代码。

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.';
    }
}

6 个答案:

答案 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>