Удалить файл после загрузки - PHP - PullRequest
1 голос
/ 23 марта 2012

Я работаю над 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 ]

5 голосов
/ 03 октября 2012

это работает для меня:

$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 голос
/ 23 марта 2012

Что вам в основном нужно сделать, так это:

  • Сканирование каталога с помощью scandir ()
  • Выполните цикл по нему и проверьте время создания файла с помощью filemtime (), чтобы найти «самый новый»file '
  • Удалите все файлы с помощью 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);
                    }
                }
            }   
        }
    }
}
0 голосов
/ 23 марта 2012

Перед созданием файла:

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

unlink($filename);

}

0 голосов
/ 23 марта 2012

Перед созданием файла выполните итерацию существующих файлов в этом каталоге и удалите ненужные файлы.

...