我想实现一个简单的计数器来跟踪文件的下载次数。我们在这里谈论大文件,所以我无法使用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请求将失败(“取消”),但反过来文件下载工作正常。
感谢任何帮助!
答案 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
我没有测试上面的内容。希望你能从这里自己弄明白。祝你好运