使用php创建具有特定扩展名的临时文件

nik*_*hil 14 php temporary-files

如何在php中创建具有指定扩展名的临时文件.我遇到tempnam()但是使用它时无法指定扩展名.

nat*_*eld 18

我找到的最简单的方法是创建临时文件,然后重命名它.例如:

 $tmpfname = tempnam(sys_get_temp_dir(), "Pre_");
 rename($tmpfname, $tmpfname .= '.pdf');
Run Code Online (Sandbox Code Playgroud)

  • 此外,重命名成功时返回 true,失败时返回 false,因此这也可能非常有用。 (2认同)

小智 11

我的方式是使用tempnam

$file = tempnam(sys_get_temp_dir(), 'prefix');
file_put_contents($file.'.extension', $data);
{
   //use your file
}
unlink($file);//to delete an empty file that tempnam creates
unlink($file.'.extension');//to delete your file
Run Code Online (Sandbox Code Playgroud)

  • 我不认为这是安全的.`tempnam()`确保`$ file`不存在.`$ file.'.extension'可能也存在. (14认同)

mob*_*ius 8

这可能会模拟mkstemp()(请参阅http://linux.die.net/man/3/mkstemp),实现您想要做的事情:

function mkstemp( $template ) {
  $attempts = 238328; // 62 x 62 x 62
  $letters  = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  $length   = strlen($letters) - 1;

  if( mb_strlen($template) < 6 || !strstr($template, 'XXXXXX') )
    return FALSE;

  for( $count = 0; $count < $attempts; ++$count) {
    $random = "";

    for($p = 0; $p < 6; $p++) {
      $random .= $letters[mt_rand(0, $length)];
    }

    $randomFile = str_replace("XXXXXX", $random, $template);

    if( !($fd = @fopen($randomFile, "x+")) )
      continue;

    return $fd;
  }

  return FALSE;
}
Run Code Online (Sandbox Code Playgroud)

所以你可以这样做:

if( ($f = mkstemp("test-XXXXXX.txt")) ) {
  fwrite($f, "test\n");
  fclose($f);
}
Run Code Online (Sandbox Code Playgroud)


小智 5

假设 tempnam() 给你一个“文件名”的文件。您将其移动到“filename.ext”。在任何时候,tempnam() 都可以再次为您提供“文件名”。如果您检查“filename.ext”,拒绝 tempnam() 给出的文件名,然后再次调用它,您仍然可能会在一个步骤与另一个步骤之间创建一个具有相同名称的文件。(这在 tempnam() 文档页面的用户评论中进行了讨论: https: //www.php.net/manual/en/function.tempnam.php。

但是,如果您只是保留 tempnam() 创建的文件(在删除“filename.ext”之前不删除“filename”)并使用该文件名+扩展名,那么 tempnam() 就不可能使用该文件再次文件名(据我所知)。是的,每个文件都有“文件名”和“文件名.ext”是很混乱的。另一方面,它解决了问题。