在 tmp 文件夹中创建新目录并存储上传的文件

问题描述

我想使用 PHP用户上传文件存储在我的 Temp 文件夹 (C:\Temp) 中,但不知道如何去做。

每次用户上传文件时,我都想在 Temp 中创建一个新目录并将文件存储在其中。该目录的名称应该是唯一的,但也应该以“FileShare”开头。例如,如果用户上传 test.txt,它应该存储在 C:\Temp\FileShareTjpwe\test.txt 中。我知道 tempnam() 有助于创建这些唯一名称,但同样,不确定如何解决这个问题。这是我迄今为止尝试过的:

if (isset($_FILES["fileName"])) {

    $fileName = basename($_FILES["fileName"]["name"]);
    $error = $_FILES["fileName"]["error"];
    $tmpName = $_FILES["fileName"]["tmp_name"];

    if ($error > 0) {
        die("File upload error");
    }
    else {
        if($fileName != '' && $tmpName != '') {
            if(sys_get_temp_dir()) {

                $tempFolder = tempnam(sys_get_temp_dir(),'FileDrop');
                unlink($tempFolder);
                mkdir($tempFolder);

                $tmpFolder = substr(tempnam(sys_get_temp_dir(),'FileDrop'),5);
                move_uploaded_file($tmpName,"/Temp/$tmpFolder/$fileName");
            }
            else {
                echo "exists";
            }
        }
    }
}

但是,对于 move_uploaded_file 部分,我收到一条错误消息,提示“无法打开流:没有这样的文件或目录”。

解决方法

您有很多事情要做,可能没有很好地使用 tempnam。如果你要回显你正在创建的变量/路径会更清楚。

如果您的网络服务器有权在 C:/Temp 中创建目录,并且您可以使用 timemicrotime,那么只需:

$fileName = basename($_FILES["fileName"]["name"]);
$tmpName = $_FILES["fileName"]["tmp_name"];

$newDir = "C:/Temp/FileDrop" . microtime(true);
mkdir($newDir);
move_uploaded_file($tmpName,"$newDir/$fileName");

您还可以生成唯一 ID:

$newDir = "C:/Temp/" . uniqid("FileDrop");

我使用 C:/Temp 是因为您提到了它,但没有显示 sys_get_temp_dir 返回的内容或您是否想使用它。

,

您使用 mkdir() 创建了错误的目录,您需要在 /Temp 中创建文件夹。您也不应该再次调用 tempnam(),它会创建一个不同的临时文件。

不要先在 sys_get_temp_dir() 中创建文件,而是在您的 /Temp 目录中创建它。

                $tempDir = tempnam("C:/Temp",'FileDrop');
                unlink($tempDir);
                mkdir($tempDir);
                move_uploaded_file($tmpName,"$tempDir/$fileName");