下载后删除文件 - PHP

时间:2012-03-23 10:06:58

标签: php file fopen moodle

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

一切正常,fopen(),fwrite()函数和csv文件每次动态创建。我已经为这段代码的用户保存了这些文件。

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

N在.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>";

}

4 个答案:

答案 0 :(得分:5)

这对我有用:

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

答案 1 :(得分:1)

你基本上需要做的是:

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

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

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

除了最新的TIMESTAMP之外删除所有文件的例子:

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

答案 2 :(得分:0)

在创建文件之前,迭代该目录中的现有文件并删除不必要的文件。

答案 3 :(得分:0)

在创建文件之前:

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

unlink($filename);

}