如何跟踪文件下载


81

我有一个网站,可以在Flash Player中播放mp3。如果用户单击“播放”,则Flash Player会自动下载mp3并开始播放。

有没有一种简便的方法来跟踪特定歌曲剪辑(或任何二进制文件)已被下载多少次?


播放链接是指向实际mp3文件的链接,还是指向弹出播放器的某些JavaScript代码的链接?

如果是后者,则可以轻松地在其中添加自己的日志记录代码,以跟踪其命中次数。

如果是前者,则需要一些可以跟踪Web服务器日志本身并进行区分的东西。我的托管计划与Webalizer一起提供,可以很好地完成此任务。

这是一个javascript代码,因此可以回答。

但是,很高兴知道如何使用其他方法(无需切换主机)来跟踪下载。

Answers:


39

有趣的是2天前,我为所有音乐写了一个php媒体库。我有一个类似的问题。我正在使用http://musicplayer.sourceforge.net/作为播放器。播放列表是通过php构建的。所有音乐请求都转到一个名为xfer.php?file = WHEREVER的脚本

$filename = base64_url_decode($_REQUEST['file']);
header("Cache-Control: public");
header('Content-disposition: attachment; filename='.basename($filename));
header("Content-Transfer-Encoding: binary");
header('Content-Length: '. filesize($filename));

//  Put either file counting code here, either a db or static files
//
readfile($filename);  //and spit the user the file

function base64_url_decode($input) {
    return base64_decode(strtr($input, '-_,', '+/='));
}

当您调用文件时,请使用类似以下内容的文件:

function base64_url_encode($input) {
     return strtr(base64_encode($input), '+/=', '-_,');
}

http://us.php.net/manual/zh/function.base64-encode.php

如果您使用某些需要mp3文件或其他内容实际链接的JavaScript或Flash播放器(例如,JW播放器),则可以附加文本“&type = .mp3”,这样最终链接将变为:“ www。 example.com/xfer.php?file=34842ffjfjxfh&type=.mp3”。这样,它看起来像以mp3扩展名结尾而不会影响文件链接。


19
此脚本中存在目录遍历漏洞!攻击者可以传入xfer.php?file = .. / .. / .. / passwd或他们想要的其他任何东西!小心!!!
亚历克斯·温斯坦

6
如果文件太大而您的流量过大,这将炸毁服务器的内存限制。
tmsimont 2011年

如何修复“目录遍历漏洞”?
Jon87 2013年

@anarchOi:最简单的方法是将GET参数$_REQUEST['file']与已知良好文件名的白名单进行比较。例如,您存储文件的目录中所有文件的清单。确保使用该目录存储要下载的文件...
BlueRaja-Danny Pflughoeft13年

@tmsimont,您是否找到降低内存消耗的任何方法?
ezpresso '17


25

使用bash:

grep mp3 /var/log/httpd/access_log | wc

此方法至少有2个缺陷:它计算GET和HEAD请求并计算所有HTTP响应代码。例如,可能有很多206条响应,这将导致您高估下载量。
8ctopus

13

如果您的歌曲/二进制文件是由apache提供的,则可以轻松grep access_log以找到下载次数。一个简单的logrotate后脚本可以对日志进行grep,并在db中维护您的计数统计信息。由于不在您的实时请求代码路径中,因此具有性能优势。离线进行统计等非关键性操作是将您的网站扩展到大量用户的一个好主意。


12

您甚至可以设置一个Apache .htaccess指令,将* .mp3请求转换为您正在使用的dubayou查询字符串。这可能是保留直接请求并且仍然能够将日志功能整合到响应中的一种好方法。


6

播放链接是指向实际mp3文件的链接,还是指向弹出播放器的某些JavaScript代码的链接?

如果是后者,则可以轻松地在其中添加自己的日志记录代码,以跟踪其命中次数。

如果是前者,则需要一些可以跟踪Web服务器日志本身并进行区分的东西。我的托管计划附带了webalizer,可以很好地完成此任务。


3

您的音乐库有数据库吗?如果下载mp3时有任何服务器代码在运行,则可以在其中添加额外的代码以增加播放次数。您可能还让javascript再次请求增加播放次数,但这可能导致人员/机器人错误地增加播放次数。

我曾经在一个互联网广播站点工作,我们使用单独的表格来跟踪每首歌曲的播放时间。我们的流由运行icecast的perl脚本提供动力,因此,每次开始播放新曲目时,我们都会触发数据库请求。然后,要计算播放次数,我们将运行查询以计算歌曲ID在播放日志中的次数。


3

我遇到类似AWStats /通过Web服务器日志读取的问题,因为大型下载通常可以拆分为日志中的数据块。这使得协调确切的下载数量变得非常困难。

我建议使用Google Analytics(分析)事件跟踪,因为每次点击一次下载链接都会注册一次。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.