jQuery.ajax,PHP,HTTP Hyperlink下载不起作用

时间:2013-06-05 19:08:15

标签: php jquery ajax download counter

我想实现一个简单的计数器来跟踪文件的下载次数。我们在这里谈论大文件,所以我无法使用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;


    });
});

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

感谢任何帮助!

3 个答案:

答案 0 :(得分: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;


});
});

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

答案 1 :(得分: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

的点击事件

答案 2 :(得分: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 =下载/ 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

我没有测试上面的内容。希望你能从这里自己弄明白。祝你好运