我的系统会创建临时文件并将它们发送给下载。这部分效果很好。问题是我想在用户下载文件后或某个时间点之后从文件系统中删除这些文件,但似乎 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
因为无法知道文件下载何时完成,并且我无法在您的评论后免费访问服务器,所以我最终创建了这个函数来删除除最后 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 个的情况很少见。