使用tempnam生成唯一的文件名

时间:2014-05-27 05:18:52

标签: php

我查看了在唯一文件命名的上下文中提到tempnam()的其他几个问题。 我有点不清楚文件名是否真的独一无二。

假设我们有一个文件上传脚本,可以将文件移动并重命名为永久目录。

我想问的是:文件名是否始终是唯一的,如下所示:

$tmp_name = tempnam($dir, '');
unlink($tmp_name);
copy($uploaded_file, "$tmp_name.$ext");

2 个答案:

答案 0 :(得分:1)

正如cantsay建议的那样,我制作了一个php脚本来查找相同的值。

function tempnam_tst() {
    for ($i=0; $i < 250000 ; $i++) {

        $tmp_name = tempnam('/tmp/', '');
        unlink($tmp_name);
        $arr[$i] = $tmp_name;
    }

    return array_intersect($arr, array_unique(array_diff_key($arr, array_unique($arr))));
}

$arr = array();

do {
    $arr = tempnam_tst();
} while ( empty($arr) );

echo 'Matching items (case-sensitive):<br>';
echo '<pre>';
print_r($arr);
echo '</pre>';

结果:

Matching items (case-sensitive):

Array
(
    [59996] => /tmp/8wB6RI
    [92722] => /tmp/KnFtJa
    [130990] => /tmp/KnFtJa
    [173696] => /tmp/8wB6RI
)

从我看到的情况来看, tempnam()并不总能生成唯一名称

答案 1 :(得分:0)

试试这个 - &gt;

$uploadPath = "/upload/";
$fileName = time().$_FILES['file_name']['name'];
$tempName = $_FILES['file_name']['tmp_name'];
move_uploaded_file($tempName,$uploadPath.$fileName);

这将在上传文件夹中上传唯一文件。