2016-07-25 138 views
2

我有一个PHP文件,其中有一个按钮,我想下载一个文件的帮助,我想尝试使用AJAX调用PHP,(因为,我觉得它更安全),目前,我有以下代码...如何知道用户是否已下载文件

<a onclick="download_file (<?= $row["id"]?>)">Download</a> 

然后download_file的功能如下:

function download_file (fileid) 
{ 
    $.ajax 
    ({ 
    type: "POST", 
    url: 'download.php', 
    data: {id: fileid}, 
    success: function(data) 
    { 
    window.location = 'download.php?link='+data; 
    } 
    }); 
} 

现在这是什么一样的是,它首先调用download.phpPOST请求(以保持位置更安全一点)fileid,以便脚本从数据库中提取文件的位置并将其作为data变量返回给AJAX脚本。

现在什么接下来的是,在成功的功能,download.php再次调用,但这次有了GET请求,然后将文件进行搜索,改名(如服务器,他们有随机的文件名),然后下载...造成这种情况的PHP代码:

header("Cache-Control: private"); 
header("Content-Description: File Transfer"); 
header("Content-Disposition: attachment; filename=".$file.""); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Type: binary/octet-stream"); 
readfile ($link); 

现在,一切都完美的作品,我担心的是安全,我想使文件更加安全,我想会产生类似的随机和独特的下载链接,后下载已经完成,链接被关闭,但文件保持不变...我想过一种方法来创建一个临时文件与另一个地址,并使用cron作业删除临时文件,但是这给了cron作业的特定时间间隔一段时间的窗口,下载链接将是静态的,这对于站点是不利的......我希望单个链接对于单个下载应该是有效的(但链接应该在整个下载,即RESUME应该支持)。

或者如果可能的话,我是否也可以使用身份验证,例如用户已登录,下载链接将处于活动状态,但只要用户退出应用程序并打开下载链接,它应该提示用户登录任一或显示404错误...

而且我也想的是如何通过任何其他方法来提高相同的安全建议...

回答

2

您将需要创建一个代理这将在您的download.php被调用之前调用。基本上你的代理将做以下事情:

  1. 根据您的会话验证用户。
  2. 生成一个UNIQUE下载链接。为此,您必须保持用户和新生成的链接之间的某种映射。
  3. 传递这个新生成的链接,该链接将作为参数传递给您的success回调函数。
  4. AJAX调用download.php链接将开始下载文件。您应该再次在download.php上使用您在用户和数据库或其他地方的下载链接之间创建的映射重新验证使用情况。我宁愿使用数据库,因为你将不得不维护一些下载历史。
  5. 下载完成后,如果用户再次尝试点击此URL,请将此映射标记为“无效”并将其重定向到某种404页面或其他内容。

希望这有助于!

+0

但是我怎么知道用户已经完成了下载? –

+0

我不认为有办法解决这个问题,因为下载过程完全在客户端/浏览器上处理。最接近你可以做的是假定用户已经下载了文件,如果他/她已经开始下载过程。 – pioneer

+0

但是后来我的文件大小只有10 MB,如果用户的Internet速度真的很糟糕,就像Kb/s一样,那么下载将会失败,因为链接将被删除,完成...所以,根本没有转移...... –

相关问题