下载后删除文件并在Cakephp中进行响应

时间:2016-06-01 20:09:33

标签: php cakephp download cakephp-2.0 delete-file

我的系统创建临时文件并将其发送到下载。那部分效果很好。问题是我想在用户下载文件后或者在某个时间点之后从文件系统中删除这些文件,但似乎是afterFilter()函数,这是最后一个运行的控制器方法,甚至在文件出现之前执行下载,所以不是一个可能性或我错过了什么。

我在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;
}

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

在之前版本的蛋糕中,我曾经使用过类似的东西:

    $this->viewClass = 'Media';

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

    $this->set($params);

并且运作良好,但现在它没有

有没有办法在临时文件被下载后取消链接?

你为解决这个问题做了什么?

使用cakephp 2.8

1 个答案:

答案 0 :(得分:0)

因为没有办法知道文件下载何时完成,并且我在评论后没有免费访问服务器,所以我最终创建了这个函数来删除除了最后5个按修改日期排序的所有文件(只是在不同用户多次下载的情况下)当另一个下载被调用时。

在控制器中使用:

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

它不是最有效的解决方案,或者本来想要使用,但不知何故解决了我的问题。唯一值得关注的是同时下载的可能性,但这种情况很少见,一次超过5次。