如何知道用户是否下载了文件

时间:2016-07-25 13:51:17

标签: javascript php jquery ajax cron

我有一个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.php请求POST fileid请求(以便使位置更安全)与data以便脚本获取来自数据库的文件的位置,并将其作为download.php变量返回给AJAX脚本。

现在接下来是成功函数,GET再次被调用,但这次是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); 请求,然后搜索,重命名文件(在服务器中,它们有随机文件名) )然后下载... PHP的代码是:

public class InputHandler : MonoBehaviour
{
GameObject theObject;
public Command buttonA, buttonD;
public float acceleration, maxSpeed;

Movement moves;

void Awake()
{
    theObject = gameObject;
    moves = new Movement(theObject, acceleration, maxSpeed);
}

void Start()
{
    buttonA = new MoveLeft(moves);
    buttonD = new MoveRight(moves);
}

void Update()
{
    HandleInput();
}

public void HandleInput()
{
    if (Input.GetKey(KeyCode.A))
    {
        buttonA.Execute();
    }
    else if (Input.GetKey(KeyCode.D))
    {
        buttonD.Execute();
    }
}
}

现在,一切都运行完美,我关心的是安全性,我想让文件更安全,我希望生成类似随机和唯一的下载链接的内容,并在下载完成后,链接被处理掉,但文件保持不变...我想到了一种方法来创建一个带有另一个地址的临时文件,并使用cron job来删除临时文件,但是这给出了一段时间的窗口,就像cron的特定时间间隔一样作业,下载链接将是静态的,这对网站不利......我希望单个链接仅对单个下载有效,(但链接应该在整个下载中,即RESUME SHOULD支持)。

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

我还想知道如何通过任何其他方法来提高相同的安全性......

1 个答案:

答案 0 :(得分:2)

您需要创建一个代理,在调用download.php之前调用该代理。基本上,您的代理将执行以下操作:

  1. 根据您的会话对用户进行身份验证。
  2. 生成一个独特的下载链接。为此,您必须在用户和新生成的链接之间保持某种映射。
  3. 将此新生成的链接传递给您的success回调函数。
  4. AJAX调用download.php链接,该链接将开始下载文件。您应该再次使用您在用户和数据库或其他地方的下载链接之间创建的映射重新验证download.php上的使用。我更喜欢使用数据库,因为你必须保留一些下载历史记录。
  5. 下载完成后,如果用户再次尝试点击此网址,请将此映射标记为非活动状态,并重定向到某种404页面或其他内容。
  6. 希望这会有所帮助!!