【问题标题】:Create a temp file with a specific extension using php使用 php 创建具有特定扩展名的临时文件
【发布时间】:2012-02-16 18:14:24
【问题描述】:

如何在 php.ini 中创建具有指定扩展名的临时文件。 我遇到了tempnam(),但无法指定扩展名。

【问题讨论】:

标签: php temporary-files


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    重命名就可以了,找到带有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);
    

    【讨论】:

      【解决方案3】:

      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”代表“后缀”。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 同样 rename 成功返回 true,失败返回 false,所以这可能也很有用。
        【解决方案5】:

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

        【讨论】:

        • 另外,unlink ($file) 不要在/tmp 中创建随机垃圾会非常有用
        • 我认为这不安全。 tempnam() 确保 $file 不存在。 $file . '.extension' 也可能存在。
        • 只要你使用足够独特的前缀并且与它的使用一致,它应该是安全的; unique-prefix-[tempnam-output].extension 仅在创建 unique-prefix-[tempnam-output] 之后创建,并且该文件保证唯一。如果您在完成扩展文件之前尝试删除 tempnam 文件,您只会遇到麻烦。
        【解决方案6】:
        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;
        }
        

        【讨论】:

          【解决方案7】:

          也许使用

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

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

          【讨论】:

            【解决方案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;
            }
            

            所以你可以这样做:

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

            【讨论】:

              猜你喜欢
              • 2010-10-09
              • 2016-12-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-02-17
              • 2020-04-05
              相关资源
              最近更新 更多