0

ファイルがダウンロードされた回数を追跡する単純なカウンターを実装したいと考えています。ここでは大きなファイルについて話しているので、ファイル全体を php のメモリにロードする readfile() や fpassthru() などを使用する方法はありません。

また、このソリューションでは、直接リンクを使用してから、jQuery.ajax を介してカウンターを更新したいと考えています。私がこの方法を選んだのは、X-Sendfile を使用した download.php がうまくいかなかったためです。1 回のダウンロードでスクリプトを複数回呼び出すことが多く、カウントが完全に台無しになりました。(これは、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;


});
});

当然、独自の URL を入力してください。

于 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 に答える