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

vql8enpb  于 2023-01-24  发布在  PHP
关注(0)|答案(9)|浏览(155)

如何在php中创建一个指定扩展名的临时文件?我遇到了tempnam(),但使用它时扩展名不能指定。

qkf9rpyu

qkf9rpyu1#

也许是用
move_uploaded_file($tmp_name, "$uploads_dir/$name.myextension");
请参见www.example.comhttp://php.net/manual/en/function.move-uploaded-file.php#example-2209

iqxoj9l9

iqxoj9l92#

重命名可以做到这一点,用pathinfo找到扩展名,然后替换为您想要的扩展名。

$tmpfname = tempnam(sys_get_temp_dir(), 'FOO');
$newname = str_replace(pathinfo($tmpfname, PATHINFO_EXTENSION),'pdf',$tmpfname);
rename($tmpfname, $newname);
//do what you want with $newname
unlink($newname);
ezykj2lf

ezykj2lf3#

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

$tmpfname = tempnam(sys_get_temp_dir(), "Pre_");
 rename($tmpfname, $tmpfname .= '.pdf');
vxqlmq5t

vxqlmq5t4#

我的方法是使用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
nkoocmlb

nkoocmlb5#

这可能会稍微模拟一下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;
}

因此,您可以:

if( ($f = mkstemp("test-XXXXXX.txt")) ) {
  fwrite($f, "test\n");
  fclose($f);
}
hrysbysz

hrysbysz6#

public static function makeTempFileInFolder($prefix, $suffix, $folder="")
{
  if (strlen($folder)==0) $folder = sys_get_temp_dir();
  do { 
    $file = $folder."/".$prefix.rand(1,99999).time().$suffix; 
  } while (file_exists($file));
  return $file;
}
dz6r00yl

dz6r00yl7#

我们就说天普南吧()给你一个文件名"filename",你把它移到"filename.ext",在任何时候,tempnam()可以再次给你"文件名",如果你检查"filename.ext",拒绝tempnam给出的文件名(),并再次调用它,你仍然以这样的可能性结束:在一步和另一步之间,将创建一个同名的文件(这在tempnam()文档页的用户注解中有讨论):https://www.php.net/manual/en/function.tempnam.php.
然而,如果你只保留tempnam()创建的文件(不删除"filename",直到你删除"filename.ext"),并使用那个文件名+扩展名,那么tempnam()就不可能再使用那个文件名了(据我所知)。是的,每个文件都有"filename"和"filename.ext"是很麻烦的。另一方面,它解决了这个问题。

yzuktlbb

yzuktlbb8#

tempnam()相同,只是增加了一个参数:

function tempnamp($dir, $prefix, $postfix) {
  $maxAttempts = 1000;
  // Trim trailing slashes from $dir.
  $dir = rtrim($dir, DIRECTORY_SEPARATOR);
  // If we don't have permission to create a directory, fail, otherwise we will
  // be stuck in an endless loop.
  if (!is_dir($dir) || !is_writable($dir)) return false;
  // Make sure characters in prefix and postfix are safe.
  if (strpbrk($prefix, '\\/:*?"<>|') !== false) return false;
  if (strpbrk($postfix, '\\/:*?"<>|') !== false) return false;
  // Attempt to create a random file until it works.
  $attempts = 0;
  do
  {
    $path = $dir.DIRECTORY_SEPARATOR.$prefix.mt_rand(100000, mt_getrandmax()).$postfix;
    $fp = @fopen($path, 'x+');
  } while (!$fp && $attempts++ < $maxAttempts);
  if ($fp) fclose($fp);
  return $path;
}

名字末尾的p代表后缀。

2ledvvac

2ledvvac9#

我更喜欢这个解决方案:

$uid = uniqid('', true);
$path = sys_get_temp_dir() . "some_prefix_$uid.myextension";

注意:我没有把前缀放在uniqid中,因为恕我直言,这不是它的职责

相关问题