Ivan
Ivan

Reputation: 529

Number of times a file (e.g., PDF) was accessed on a server

I have a small website with several PDFs free for download. I use StatCounter to observe the number of page loads. It also shows me the number of my PDF downloads, but it considers only those downloads where a user clicks on the link from my website. But what's with the "external" access to the PDFs (e.g., directly from Google search)? How I can count those? Is there any possibility to use a tool such as StatCounter?

Thanks.

Upvotes: 2

Views: 860

Answers (4)

Lie Ryan
Lie Ryan

Reputation: 64943

in php, it would be something like (untested):

$db = mysql_connect(...);
$file = $_GET['file'];
$allowed_files = {...}; // or check in database
if (in_array($file, $allowed_files) && file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/pdf');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    mysql_query('UPDATE files SET count = count + 1 WHERE file="' . $file . '"')

    readfile($file);
    exit;
} else {
    /* issue a 404, or redirect to a not-found page */
}

Upvotes: 1

strkol
strkol

Reputation: 2028

.htaccess (redirect *.pdf requests to download.php):

RewriteEngine On
RewriteRule \.pdf$ /download.php

download.php:

<?php
$url = $_SERVER['REQUEST_URI'];
if (!preg_match('/([a-z0-9_-]+)\.pdf$/', $url, $r) || !file_exists($r[1] . '.pdf')) {
    header('HTTP/1.0 404 Not Found');
    echo "File not found.";
    exit(0);
}

$filename = $r[1] . '.pdf';
// [do you statistics here] 
header('Content-type: application/pdf');
header("Content-Disposition: attachment; filename=\"$filename\"");
readfile($filename);
?>

Upvotes: 1

Salman Arshad
Salman Arshad

Reputation: 272406

You can use a log analyzer to check how many times a file was accessed. Ask you hosting provider if they provide access to access logs and a log analyzer software.

Upvotes: 1

jorgebg
jorgebg

Reputation: 6600

You would have to create a way to capture the request from the server.

If you are using php, probably the best would be to use mod_rewrite. If you are using .net, an HttpHandler.

You must handle the request, call statcounter and then send the pdf content to the user.

Upvotes: 0

Related Questions