我有一个网站,允许用户使用预先签名的URL安全地从S3下载文件,但我想记录下载文件的人以及何时下载。
我尝试过将它们重定向到另一个页面,然后使用一段JavaScript自动下载文件,然后将记录插入数据库表中,但是一旦脚本运行,它就会停止其余部分。页面加载停止重定向回来。
我正在使用的JavaScript如下:
<script>window.location.href = “url”</script>
有可能吗?
答案 0 :(得分:3)
我建议您在将文件返回给用户之前在PHP层上记录下载。您可以从会话中获取所需信息,例如IP地址或用户信息,将其存储在数据库中,然后将相应的标头发送回用户并开始下载文件。您不需要将用户重定向到新页面。
编辑:
例如,在downloads.php上你可以:
<?php
// 1) Get the information that you would like to log
$user_agent = $_SERVER['HTTP_USER_AGENT'];
$ip = $_SERVER['REMOTE_ADDR'];
$username = $_SESSION['username'];
// ...
// 2) Store the information on your database
// For example, add a MySQL INSERT here
// ...
// 3) Return the appropriate file to the user
// Code extracted from https://stackoverflow.com/questions/6175533/
$attachment_location = $_SERVER["DOCUMENT_ROOT"] . "/file.zip";
if (file_exists($attachment_location)) {
header($_SERVER["SERVER_PROTOCOL"] . " 200 OK");
header("Cache-Control: public"); // needed for internet explorer
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: Binary");
header("Content-Length:".filesize($attachment_location));
header("Content-Disposition: attachment; filename=file.zip");
readfile($attachment_location);
die();
} else {
die("Error: File not found.");
}
有关PHP $ _SESSION和$ _SERVER的更多信息:
PHP $_SESSION
PHP $_SERVER
编辑2:
另一个可能有用的标题组合:
header("Content-Disposition: attachment; filename=" . urlencode($file));
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Length: " . filesize($file));
有关PHP标头的更多信息:
PHP Headers