透明记录下载的最佳方式?

时间:2009-01-30 00:01:54

标签: lamp download

我有一个个人项目,现在已经在线了一段时间。通过这样做,我一直在保持下载量:

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

这在某些时候运作良好;但是,它会阻止用户right-click > save target as...,因为他们实际上只会在“文件保存...”对话框中看到download.php。因此,下载项目的唯一方法是左键单击链接。

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

对于它的价值,该机器是标准的LAMP堆栈,因此这里没有.NET选项。

4 个答案:

答案 0 :(得分: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告诉它将其保存为下载。

另一种选择是定期检查日志文件,例如每天使用脚本。

答案 1 :(得分:1)

这就是很多网站使用下载链接进入另一个页面的原因,该页面将在页面加载时自动开始下载,并为用户提供直接下载的链接。大多数情况下,这是一种获取广告展示次数的网页浏览量的方法,但它也可以帮助您更轻松地跟踪谁下载文件。

答案 2 :(得分:1)

answer详细说明了如何使用传输页面记录下载以及在用户单击链接后立即开始下载文件。我最近测试了它是否正确点击。

我正在使用php中间人来记录文件下载。格式化为http://192.168.1.1/xfer.php?file=Li9zb25ncy9HTE9XX0xlYXZlIFlvdXIgSGF0IE9uLm1wMw的网址会生成“另存为...”的文件名,并在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是文件名保存的文件夹。

答案 3 :(得分:1)

设置Google Analytics? :)