问题描述
我想使用 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
中创建目录,并且您可以使用 time
或 microtime
,那么只需:
$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");