如何在将上传的文件保存到目录之前重命名?


76

下面是我用来将文件上传到目录中的代码。它工作正常。我的主要问题是:

move_uploaded_file()是将上载的文件保存到目录中的文件,也是我猜测move_uploaded_file()是为其设置名称的文件。

如何将文件名更改为随机数?

我尝试在下面这样做:

$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/jpg") || ($_FILES["file"]["type"] == "image/pjpeg") || ($_FILES["file"]["type"] == "image/x-png") || ($_FILES["file"]["type"] == "image/png")) && ($_FILES["file"]["size"] < 100000) && in_array($extension, $allowedExts)) {
    if ($_FILES["file"]["error"] > 0) {
        echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
    } else {

        $fileName = $temp[0] . "." . $temp[1];
        $temp[0] = rand(0, 3000); //Set to random number
        $fileName;

        if (file_exists("../img/imageDirectory/" . $_FILES["file"]["name"])) {
            echo $_FILES["file"]["name"] . " already exists. ";
        } else {
            move_uploaded_file($_FILES["file"]["tmp_name"], "../img/imageDirectory/" . $_FILES["file"]["name"]);
            echo "Stored in: " . "../img/imageDirectory/" . $_FILES["file"]["name"];
        }
    }
} else {
    echo "Invalid file";
}

我尝试更改$ _FILES [“ file”] [“ name”]之类的变量,并将其替换为$ fileName;。变量,以便可以存储新名称。

Answers:


169

您可以通过在的第二个参数中更改文件名来简单地更改文件名move_uploaded_file

代替

move_uploaded_file($_FILES["file"]["tmp_name"], "../img/imageDirectory/" . $_FILES["file"]["name"]);

采用

$temp = explode(".", $_FILES["file"]["name"]);
$newfilename = round(microtime(true)) . '.' . end($temp);
move_uploaded_file($_FILES["file"]["tmp_name"], "../img/imageDirectory/" . $newfilename);

更改为反映您的问题,将根据当前时间产生一个随机数,并附加原始上传文件中的扩展名。


8
最好使用microtime()而不是生成时间戳rand。如果随机值与已使用的值冲突,则文件将被覆盖而不会发出警告。
tmh

4
OP正在使用file_exists(),因此,如果他正确使用它,则发生这种情况的可能性为0%。
Ben Fortune

1
是Ben Fortune的一个很好且易于使用的答案。谢谢Ben
user2491321 2015年

1
我们也可以使用time(),它更强大。
Mihir Ujjainwal

1
这回答了问题,但在文件上传后不对其进行处理。仅使用file_exists可以避免在上传时覆盖相同名称的文件。但是,之后如何检索该文件?我宁愿在数据库上使用唯一ID,并使用该唯一ID存储(重命名)每个上载的文件(在DB中,您在同一记录上具有原始文件名和唯一ID)。通过文件的唯一ID检索文件,并使用文件名显示/下载文件。我们如何在服务器上存储文件以及如何显示或下载文件是不同的事情。
Adrian P.

4

你猜对了。阅读有关的手册页move_uploaded_file。将第二个参数设置为要保存文件的位置。

如果不起作用,则说明您的出现了问题$fileName。请发布您的最新代码。


4

你可以试试看

$newfilename= date('dmYHis').str_replace(" ", "", basename($_FILES["file"]["name"]));

move_uploaded_file($_FILES["file"]["tmp_name"], "../img/imageDirectory/" . $newfilename);

3
/* create new name file */
$filename   = uniqid() . "-" . time(); // 5dab1961e93a7-1571494241
$extension  = pathinfo( $_FILES["file"]["name"], PATHINFO_EXTENSION ); // jpg
$basename   = $filename . "." . $extension; // 5dab1961e93a7_1571494241.jpg

$source       = $_FILES["file"]["tmp_name"];
$destination  = "../img/imageDirectory/{$basename}";

/* move the file */
move_uploaded_file( $source, $destination );

echo "Stored in: {$destination}";

1

move_uploaded_file如果文件未成功移动,它将返回false,您可以在代码中添加一些内容,以在发生这种情况时在日志中提醒您,这应该可以帮助您弄清为什么在重命名文件时遇到麻烦

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.