2016-06-01 8 views
0

Mein System erstellt temporäre Dateien und sendet sie zum Download. Dieser Teil funktioniert sehr gut. Das Problem ist, dass ich diese Dateien aus dem Dateisystem nach dem Download der Datei oder einfach danach irgendwann in der Zeit löschen möchte, aber scheint nach AfterFilter() -Funktion, die die letzte Controller-Methode ausgeführt wird, noch bevor die Datei ausgeführt wird heruntergeladen, so ist keine Möglichkeit oder ich vermisse etwas.Datei nach dem Download mit Antwort in CakePHP löschen

Ich habe diese Funktionen in einem DowloaderController

public function download() { 
    $fileName = $this->Session->read('nameFile'); 

    if (!is_file(STORAGEPATH . $fileName)) { 
     return; 
    } 

    $this->response->file(STORAGEPATH . $fileName); 
    $this->response->download($fileName); 
    return $this->response; 
} 

und

public function afterFilter() { 
    if ($this->Session->check('nameFile')) { 
     if (is_file(STORAGEPATH . $this->Session->read('nameFile'))) { 
      @unlink(STORAGEPATH . $this->Session->read('nameFile')); 
     } 
     $this->Session->delete('nameFile'); 
    } 
} 

In einer früheren Version von Kuchen, benutzte ich wie etwas zu verwenden:

$this->viewClass = 'Media'; 

    $params = array(
     'id' => $fileName, 
     'name' => $fileAlias, 
     'download' => true, 
     'extension' => $extension, 
     'path' => $path 
    ); 

    $this->set($params); 

und hat gut funktioniert , aber jetzt tut es nicht

Gibt es eine Möglichkeit, die temporäre Datei sofort nach dem Downloaden zu trennen?

oder

, was Sie haben, dieses Problem zu lösen getan?

mit CakePHP 2.8

+0

Es gibt keine Möglichkeit von PHP zu wissen, wann eine Datei heruntergeladen wurde. Sobald Sie die Datei zurück zum Client gelesen haben, ist PHP abgeschlossen, ob der Client fertig ist, die Datei zu speichern oder nicht. Die Clientseite signalisiert dem Server nicht, dass sie "Ich bin fertig" sagen soll. –

+0

Danke, dass du mir das erzählt hast, ich wusste es nicht. ok ok, aber muss ein anderer Weg sein, um diese Dateien zu kontrollieren, ich denke, ich benutze kein Ereignis oder einen Rückruf von Kuchen, wenn sie die Aktion nicht kontrollieren können. Ich werde versuchen, eine Header-Location und umleiten zu einer anderen Methode mit der Antwort, aber ich möchte nicht wirklich eine Umleitung tun, weil es eine Download-Aktion ist. Könntest du das wissen, könntest du ein anderer Weg sein oder alternativ, um diese besondere Situation zu lösen? – Antonycx

+0

Sie müssen den Cron-Job ausführen, um temporäre Dateien zu löschen (nur alte Dateien löschen). – Manmohan

Antwort

0

Da es keine Möglichkeit, wenn der Download der Datei zu wissen ist, fertig war und ich nach Ihren Kommentaren freien Zugriff auf den Server nicht haben, ich die Schaffung diese Funktion beendet, um alle Dateien mit Ausnahme des lösche die letzten 5 nach Datum sortiert (nur bei mehreren Downloads von verschiedenen Benutzern), wenn ein anderer Download aufgerufen wird.

Verwendung in der Steuerung:

App::uses('Folder', 'Utility'); 
App::uses('File', 'Utility'); 

protected function _clearTemporaryFiles() { 
    $dir = new Folder(STORAGEPATH); 
    $files = $dir->find('.*', true); 
    if (count($files) > 5) { 
     foreach ($files as $key => $file) { 
      $file = new File($dir->pwd() . DS . $file); 
      $files[$key] = array(); 
      $files[$key]['name'] = $file->name() . '.' . $file->ext(); 
      $files[$key]['lastUpdate'] = $file->lastChange(); 
      $file->close(); 
     } 

     $orderedFiles = Set::sort($files, '{n}.lastUpdate', 'asc'); 
     $orderedFiles = array_splice($orderedFiles, 0, count($orderedFiles) - 5); 
     foreach ($orderedFiles as $archivo) { 
      $archivo = new File($dir->pwd() . DS . $archivo['name']); 
      $archivo->delete(); 
      $file->close(); 
     } 
    } 
} 

Es ist nicht die effizienteste Lösung, oder würde wollte benutzen müssen, aber irgendwie mein Problem zu lösen. Die einzige Sorge ist die Möglichkeit der Downloads zur gleichen Zeit, aber es wäre ein seltener Fall, dass mehr als 5 gleichzeitig waren.