0

我想实现一个简单的计数器来跟踪文件下载了多少次。我们在这里讨论的是大文件,所以我无法使用 readfile()、fpassthru() 或类似的方法将整个文件加载到 php 的内存中。

此外,对于这个解决方案,我想使用直接链接,然后通过 jQuery.ajax 更新计数器。我之所以选择这种方式,是因为带有 X-Sendfile 的 download.php 对我来说不起作用 - 通常我会收到多次调用脚本以进行一次下载,这完全打乱了我的计数。(这可能是由于 Chrome 对 favicon 的额外请求,但我不确定。另外,这不是问题。)

这基本上是我的 index.html:

<a href="downloads/bla.zip"><span class="countDownload">bla</span></a>

这是jQuery:

$(document).ready(function() {

    $("body").on("click", ".countDownload", function() {
        var filename = $(this).parent().attr("href");
        filename = filename.split("/");
        filename = filename[filename.length - 1]

        var request = $.ajax({
            url: "counter.php?file=" + filename
        });

        request.done(function(msg) {
            alert("yes");
        });

        request.fail(function(jqXHR, textStatus) {
            alert("no");
        });

        // if this is here, ajax works, but download fails
        return false;


    });
});

如果“返回false;” 在那里,ajax请求会成功,但是文件下载会被抑制。如果“返回false;” 不存在,ajax 请求将失败(“取消”),但反过来文件下载工作正常。

任何帮助表示赞赏!

4

3 回答 3

2

100% 未经测试,但只是一个想法......

$(document).ready(function() {

$("body").on("click", ".countDownload", function(e) {
    e.preventDefault();

    var filename = $(this).parent().attr("href");
    filename = filename.split("/");
    filename = filename[filename.length - 1]

    var request = $.ajax({
        url: "counter.php?file=" + filename
    });

    request.done(function(msg) {
        alert("yes");
        window.location.href = "*****URL******"+filename;
    });

    request.fail(function(jqXHR, textStatus) {
        alert("no");
    });

    // if this is here, ajax works, but download fails
    return false;


});
});

显然是填写你自己的网址。

于 2013-06-05T19:18:54.160 回答
0

那这个呢

<a href="downloads/bla.zip" id="download" style="display:none"></a>
<span class="countDownload">bla</span>


$(document).ready(function() {

$("body").on("click", ".countDownload", function() {
    var filename = $("#download").attr("href");
    filename = filename.split("/");
    filename = filename[filename.length - 1]

    var request = $.ajax({
        url: "counter.php?file=" + filename
    });

    request.done(function(msg) {
        alert("yes");
    });

    request.fail(function(jqXHR, textStatus) {
        alert("no");
    });

    $("#download").trigger("click");
    return false;


});
});

首先它将通过您的ajax请求然后触发点击事件anchor

于 2013-06-05T19:22:05.693 回答
0

您的 HTML:

<div class="result"></div>
<button url="downloads/bla.zip">Click to download the file</button>

你的脚本:

$(document).ready(function()
{
    $('button').on('click',function()
    {
        var filename = $(this).attr('url');
        var request = $.ajax(
        {
            url: "download_file.php?file=" + filename
        });
        request.done(function(msg)
        {
            $('.result').html('Thank you for downloading!');
        });
        request.fail(function(jqXHR, textStatus)
        {
            $('.result').html('Download failed!');
        });
    });
});

download_file.php?file=downloads/bla.zip:

    //First find this file :)
if(!empty($_POST['file']))
{
    $dirpath = 'location/of/file/'; 
    if(file_exists($dirpath))
    {
        $file = $dirpath.$_POST['file'];
        header('Content-Description: Secure file download');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename=' . basename($file));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));
        ob_clean();
        flush();
        readfile($file);
        //DO YOUR COUNTING SOMEWHERE HERE:
        exit;
    }
}
else
{
    //LOG ERROR HERE:
    exit;
}

为了稍微保护您的文件,请将此 .htaccess 放在您的下载文件夹中:

Order deny,allow
Deny from all

我没有测试上述内容。希望你能从这里自己弄清楚。祝你好运

于 2013-06-05T19:37:40.943 回答