在动态网站上,创建一个具有特定扩展名的临时文件是一个常见的需求。这种需求主要来自 Microsoft 浏览器,它们根据文件的扩展名识别下载文件的 MIME 类型。
没有单个 PHP 函数可以创建具有特定扩展名的临时文件名,而且正如所见,除非你使用 PHP 原子原语,否则会涉及竞态条件。
我在下面只使用原语,并利用操作系统依赖的行为来安全地创建一个具有特定后缀、前缀和目录的文件。尽情享用。
<?php
function secure_tmpname($postfix = '.tmp', $prefix = 'tmp', $dir = null) {
if (! (isset($postfix) && is_string($postfix))) {
return false;
}
if (! (isset($prefix) && is_string($prefix))) {
return false;
}
if (! isset($dir)) {
$dir = getcwd();
}
$tries = 1;
do {
$sysFileName = tempnam($dir, $prefix);
if ($sysFileName === false) {
return false;
}
$newFileName = $sysFileName . $postfix;
if ($sysFileName == $newFileName) {
return $sysFileName;
}
$newFileCreated = (isWindows() ? @rename($sysFileName, $newFileName) : @link($sysFileName, $newFileName));
if ($newFileCreated) {
return $newFileName;
}
unlink ($sysFileName);
$tries++;
} while ($tries <= 5);
return false;
}
?>
isWindows 函数主要留作读者的练习。以下是一个起点
<?php
function isWindows() {
return (DIRECTORY_SEPARATOR == '\\' ? true : false);
}
?>
与 tempnam() 一样,此函数要求你稍后清理自己的文件。在 UNIX(你可以将文件名重命名为现有文件,因此我使用了链接)下,你必须删除链接和链接的目标。清理完全留给读者。