Creați un fișier temporar cu o anumită extensie folosind php (Programare, Php, Fișiere Temporare)

nikhil a intrebat.

Cum pot crea un fișier temporar cu o anumită extensie în php.Am dat peste tempnam() dar folosindu-l extensia nu poate fi specificată.

Comentarii

  • de ce trebuie să o faci? dacă este doar un fișier temporar, extensia nu ar trebui să conteze deloc. –  > Por oezi.
  • Nu, nu puteți specifica o extensie pentru tempname(), va trebui să creați o funcție personalizată pentru acest lucru, aruncați o privire la User Contributed Notes la theserverpages.com/php/manual/en/function.tempnam.php –  > Por Cyclonecode.
6 răspunsuri
mobius

Acest lucru ar putea simula mkstemp() (vezi http://linux.die.net/man/3/mkstemp) un pic, realizând ceea ce doriți să faceți:

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;
}

Deci, ați putea face:

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

Nathan Hayfield

Cea mai ușoară metodă pe care am găsit-o este să creați un fișier temporar și apoi doar să-l redenumiți. De exemplu:

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

Comentarii

  • De asemenea, redenumirea returnează true în caz de succes și false în caz de eșec, așa că probabil că și asta este destul de util. –  > Por nathan hayfield.
Yasmany Hernandez Hernandez Hernandez

modul meu de lucru este să folosesc 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

Comentarii

  • De asemenea, ar fi foarte util să unlink ($file) să nu se creeze gunoaie aleatorii în /tmp –  > Por Dmitri Ginzburg.
  • 15

  • Nu cred că acest lucru este sigur. tempnam() se asigură că $file nu există. $file . '.extension' poate la fel de bine să existe. –  > Por hytromo.
  • Atâta timp cât folosiți un prefix suficient de unic și sunteți consecvent cu utilizarea acestuia, ar trebui să fie sigur; unique-prefix-[tempnam-output].extension este creat numai după ce unique-prefix-[tempnam-output] este creat, iar fișierul respectiv a fost garantat unic. Veți avea probleme doar dacă încercați să ștergeți fișierul tempnam înainte de a termina cu fișierul extins. –  > Por rymo.
Jorge
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;
}

Lobo

Poate folosind

move_uploaded_file($tmp_name, "$uploads_dir/$name.myextension");

A se vedea http://php.net/manual/en/function.move-uploaded-file.php#example-2209

Alexander

Același lucru ca și tempnam() cu excepția parametrului suplimentar:

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;
}

Acel „p” de la sfârșitul numelui reprezintă „postfix”.