使用我的PHP网站记录谁从S3下载了哪个文件

时间:2018-02-20 21:41:51

标签: javascript php amazon-s3

我有一个网站,允许用户使用预先签名的URL安全地从S3下载文件,但我想记录下载文件的人以及何时下载。

我尝试过将它们重定向到另一个页面,然后使用一段JavaScript自动下载文件,然后将记录插入数据库表中,但是一旦脚本运行,它就会停止其​​余部分。页面加载停止重定向回来。

我正在使用的JavaScript如下:

<script>window.location.href = “url”</script>

有可能吗?

1 个答案:

答案 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