【问题标题】:Delete file after downloading - PHP下载后删除文件 - PHP
【发布时间】:2012-10-03 19:17:02
【问题描述】:

我正在开发 Moodle 2.2.1,并使用某些查询创建了 dynamic.csv 文件。我在我的主目录中创建了一个具有写入权限的 /tmp/ 目录,并使用文件函数通过我的代码创建了一个 .csv 文件。

使用正常的 fopen()、fwrite() 函数一切正常,并且每次动态创建 csv 文件。我保留了这些文件以供使用这段代码的用户下载。

<a href='/moodle/tmp/'".$filename."'> Download </a>

在.htaccess 中有这一行,文件可以下载到任何人的机器上。

 AddType application/octet-stream .csv

但现在的问题是,每次我加载页面时,都会创建具有不同时间戳的相同 .csv 文件。基本上,我的 /tmp/ 目录中有很多具有不同时间戳的重复文件。

有没有一种方法可以在每次加载该页面时,删除该文件夹中文件的所有现有实例,并准备好一批新文件可供下载。这样我就没有重复的文件,每个文件只有一个实例。

如果有人能帮我解决这个问题,我将不胜感激。

谢谢

编辑:如果我创建和编写 .csv 文件的代码是这样的,那么我应该在哪里删除一个小时前带有时间戳的旧文件以及如何保留最新文件。

 foreach($uniquenames as $uniquename)
 {
$data = "Header1,Header2,Header3,Header4,Header5\n";
$filename = $uniquename.'_'.time().'.csv';
$writepath = $filepath.$filename;
$fh       = fopen($writepath, 'w');
$result = $functions->getFiless();
foreach($result as $activity)
{
    if($uniquename == $activity->quiz)
    {
        $data .= .$somedata.",".$foreachheader."\n";        
    }
    else
    {

    }
}
fwrite($fh, $data);
fclose($fh);
echo "<p>".$uniquename . "<div class='assessment-reportlink'><a href='/moodle/tmp/".$filename."'> Download </a></p></div>";

}

【问题讨论】:

    标签: php file fopen moodle


    【解决方案1】:

    这对我有用:

    $file = $_GET['f'];
    
    if ($file and file_exists($file)) 
    {
      header('Content-Description: File Transfer');
      header('Content-Type: application/octet-stream');
      header('Content-Disposition: attachment; filename='.basename($file));
      header('Content-Transfer-Encoding: binary');
      header('Expires: 0');
      header('Cache-Control: must-revalidate');
      header('Pragma: public');
      header('Content-Length: ' . filesize($file));
      ob_clean();
      flush();
      if (readfile($file)) 
      {
        unlink($file);
      }
    }
    

    【讨论】:

      【解决方案2】:

      你基本上需要做的是:

      • 用scandir()扫描目录
      • 遍历它并使用 filemtime() 检查文件创建时间以找到“最新文件”
      • 使用 unlink() 删除所有时间戳较旧的文件

      但请记住,有时保留具有较旧时间戳的文件是个好主意。如果在并行会话中运行的用户存在指向旧文件之一的链接怎么办?我建议不要根据“最新”删除文件,而是根据时间删除文件。

      也许删除所有超过一小时且不是最新文件的文件。

      删除所有文件的示例,具有最新时间戳的文件除外:

      // This is where I would scan the files from
      $directory='./mycsv/';
      
      // This scans the files
      $files=scandir($directory);
      
      // I will store the 'newest' timestamp here
      $newestFileModifiedTime=0;
      
      // Making sure that there are files
      if(!empty($files)){
          foreach($files as $file){
              // This ignores all current and parent directory references
              if($file!='.' && $file!='..'){
                  // This ignores a directory, if that folder has other folders in it
                  if(!is_dir($directory.$f)){
                      $fileModifiedTime=filemtime($directory.$file);
                      if($fileModifiedTime>$newestFileModifiedTime){
                          $newestFileModifiedTime=$fileModifiedTime;
                      }
                  }
              }   
          }
          // We loop again since we found a file timestamp
          if($newestFileModifiedTime!=0){
              foreach($files as $file){
                  // This ignores all current and parent directory references
                  if($file!='.' && $file!='..'){
                      // This ignores a directory, if that folder has other folders in it
                      if(!is_dir($directory.$f)){
                          // This deletes all the files that are not with the newest timestamp
                          if(filemtime($directory.$file)!=$newestFileModifiedTime){
                              // Deleting the file
                              unlink($directory.$file);
                          }
                      }
                  }   
              }
          }
      }
      

      【讨论】:

      • 试试这个可以帮到你
      • 所以我在我的 foreach 循环中按照问题中的编辑或如何进行操作?如果你 cud 获取我的代码的 sn-p 并准确地告诉我你想说什么,那将非常有用。谢谢。
      • 我添加了一个删除除最新文件之外的所有内容的示例。虽然我没有使用你的代码作为基础,但我相信它很容易弄清楚。如果您可以使用 scandir() 根据修改时间对文件进行排序,这将更容易,它不必循环两次。另一种方法是使用 user1283565 推荐的方法,在生成新文件之前删除所有文件,但这在某些情况下可能不好。
      【解决方案3】:

      在创建文件之前,请遍历该目录中的现有文件并删除不需要的文件。

      【讨论】:

        【解决方案4】:

        文件创建前:

        foreach (glob("*.csv") as $filename) {

        unlink($filename);

        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-13
          • 2018-06-18
          • 2014-12-05
          • 2017-05-25
          相关资源
          最近更新 更多