在动态网站上,通常需要使用特定扩展名创建临时文件。很大程度上,这种需求源于 Microsoft 浏览器根据文件的扩展名识别下载文件的 MIME 类型。
没有一个 PHP 函数可以使用特定扩展名创建临时文件名,并且,如已经显示的那样,除非您使用 PHP 原子原语,否则会涉及到竞争条件。
我在下面仅使用原语,并利用 OS 依赖行为来安全地创建具有特定后缀、前缀和目录的文件。请享用。
<?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 下(您可以重命名到现有文件,所以我使用了链接),您将必须同时删除链接和链接的目标。清理工作完全留给读者。