3

我有一个个人项目已经上线一段时间了。我一直通过这样做来记录下载量:

  • 当用户单击下载链接时,它会点击一个将一些信息写入表的 PHP 脚本。
  • 写入数据后,脚本将返回实际文件的路径。
  • 然后,用户可以将文件保存到他们的硬盘上,就好像它是任何其他下载一样。

这已经足够好一段时间了。但是,它会阻止用户这样做,right-click > save target as...因为他们实际上只会看到download.php出现在“文件保存..”对话框中。因此,下载项目的唯一方法是左键单击链接。

我想改进这个过程,以便用户可以使用他/她最舒服的任何方法下载项目。那么,有什么更好的方法可以透明地记录下载而不妨碍用户呢?

值得一提的是,这台机器是标准的 LAMP 堆栈,所以这里没有 .NET 选项。

4

4 回答 4

3

这取自php-documentation,但也可以使用不同的脚本语言:

<?php
// We'll be outputting a PDF
header('Content-type: application/pdf');

// It will be called downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// The PDF source is in original.pdf
readfile('original.pdf');
?>

HTTP-Header Content-Disposition 告诉它将其保存为下载。

另一种选择是定期检查您的日志文件,就像每天使用脚本一样。

于 2009-01-30T00:18:32.230 回答
1

这就是许多网站使用下载链接将您带到另一个页面的原因,该页面将在页面加载时自动开始下载,并为用户提供直接下载的链接。大多数情况下,这是一种获取广告印象页面浏览量的方法,但它也有助于更轻松地跟踪谁在下载他们的文件。

于 2009-01-30T00:08:12.157 回答
1

答案详细说明了如何使用传输页面记录下载以及在有人单击链接后立即开始下载文件。我最近测试了它的右键单击。

我正在使用 php 中间人来记录文件下载。格式为http://192.168.1.1/xfer.php?file=Li9zb25ncy9HTE9XX0xlYXZlIFlvdXIgSGF0IE9uLm1wMw的 URL会在 Firefox 中生成另存为...和左键单击的文件名。

这是我的 xfer.php

<?
$filename = base64_url_decode($_GET['file']);
if ($_GET['file']){
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header('Content-disposition: attachment; filename='.str_replace(" ", "_",basename($filename)));
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. filesize($filename));
    readfile($filename);
}
$fh = fopen("test.html","a");
fwrite($fh,basename($filename)."\n<br />");
fclose($fh);
function base64_url_decode($input) {
    return base64_decode(strtr($input, '-_,', '+/='));
}
?>

链接到 xfer.php 的页面是

$link = "xfer.php?file=".base64_url_encode("./songs/$key");

$key文件名,songs是保存文件名的文件夹。

于 2009-01-30T00:11:55.813 回答
1

设置谷歌分析?:)

于 2009-01-30T01:40:19.927 回答