我想到的解决方案如下:如果你有代表文件的表,例如 FileModel 你可以在那里保存文件的名称、一些细节、大小、文件系统中文件的路径和唯一的,这可以是您根据一些文件详细信息为它选择的一些数据的 md5 的结果,例如:
$data[FileModel]['unique'] = md5(time() . $data[FileModel]['file']);
每次在让某人下载您的文件之前,您检查表中是否有这样的唯一值,如果是这样,您让某人使用在 FileModel 中创建的您的 downloadFile 方法下载它,但在此之前,您创建新的唯一值以防止更多下载
$data[FileModel]['unique'] = md5(time() . $data[$this -> name]['file']);
$this -> FileModel-> save($data[$this -> name]);
$this -> FileModel -> downloadFile($data[$this -> name]);
如果您的数据库中没有这样的唯一值,那么您只会向用户显示有关超时链接的错误
$this -> setFlashError('link expired');
在这里,我为您提供了一个示例动作原型,您可以在控制器中开始:
function download($file_data = ''){
$data = $this->FileModel->find('first', array('conditions' => array('FileModel.unique' => $file), 'fields' => array('*')));
if(!is_array($data[FileModel])) $this -> setFlashError('link expired');
else
{
$data[FileModel]['unique'] = md5(time() . $data[$this -> name]['file']);
$this -> FileModel-> save($data[$this -> name]);
if(!$this -> FileModel -> downloadFile($data[$this -> name]))
{
$this -> setFlashError('error'));
}
}
}
您还可以创建日期时间字段,例如,您可以将 1 天添加到当前日期并检查剩余时间是否已过期。