Download Logger and Counter
When you have a file for people to download, they need a way to do so.
The PHP code and HTML meta tag on this page together provide a way.
The code and meta tag make any web page into a download page. When the browser lands on the download page, the download is initiated automatically.
What happens when the download is automatically initiated is the same as would happen if the person tapped on a link to a file:
-
If the file is a
*.zip
or other file with a file name extension that browsers automatically download, the download can happen without the browser leaving the page. -
Otherwise, the page in the browser window will be replaced with the content of the file. The user can then decide whether or not to download the file currently displayed in the browser window.
What the PHP code and HTML meta tag do is make it so the user doesn't have to tap a link — it just happens automatically.
Plus, with this system, the download may optionally be logged as a CSV file (date/time, IP address, …). And, also optionally, the download may be counted.
To implement the auto-download functionality, you create a web page for this purpose. The web page may contain whatever content you want — instructions, announcements, a video, whatever.
In the HEAD area of your web page, you pop in the PHP script and an HTML meta tag to automatically initiate the download.
Implementing Automatic Download
In the HEAD area of the download web page source code, insert the following PHP script and HTML meta tag. (Notes follow.)
<?php /* Download Logger and Counter Version 1.0 November 11, 2019 Will Bontrager Software LLC https://www.willmaster.com/ */ /* *** Customizations *** */ // 3 places to customize: // Place 1: // The URL of the downloadable file. $URLofDownloadableFile = "/downloads/thedoc.zip"; // Place 2: // Optionally, the location of the download log CSV file. Otherwise, leave blank. $LocationOfLogFile = "/downloads/log/log.csv"; // Place 3: // Optionally, the location of the download count file. Otherwise, leave blank. $LocationOfCountFile = "/downloads/log/count.txt"; /* *** End of Customizations *** */ if( (!empty($LocationOfCountFile)) and strlen($LocationOfCountFile)>2 ) { if( strpos($LocationOfCountFile,'/')===0 ) { $LocationOfCountFile = "{$_SERVER['DOCUMENT_ROOT']}$LocationOfCountFile"; } file_put_contents($LocationOfCountFile,'x',FILE_APPEND); } if( (!empty($LocationOfLogFile)) and strlen($LocationOfLogFile)>2 ) { if( strpos($LocationOfLogFile,'/')===0 ) { $LocationOfLogFile = "{$_SERVER['DOCUMENT_ROOT']}$LocationOfLogFile"; } $LogCell = array(); $LogCell[] = date('r'); $LogCell[] = $_SERVER['REMOTE_ADDR']; $LogCell[] = str_replace('"','""',$URLofDownloadableFile); $LogCell[] = str_replace('"','""',$_SERVER['HTTP_USER_AGENT']); file_put_contents($LocationOfLogFile,'"'.implode('","',$LogCell)."\"\n",FILE_APPEND); $filehandle = fopen($LocationOfLogFile,'a'); } ?> <meta http-equiv="refresh" content="0; url=<?php echo($URLofDownloadableFile) ?>">
Notes:
The above code box contains PHP code and, immediately below the PHP code, one line that is an HTML meta tag. That HTML meta tag needs to be below the PHP code because the PHP code provides a value the meta tag requires.
Because we have our attention on it, let's mention what can be customized in the meta tag now, before we address the preceding PHP code.
Within the meta tag, you'll see content="0;
The 0
specifies the number of seconds to delay before the download proceeds, 0
seconds in this case. To implement a delay, specify a number greater than 0
.
Now, the PHP code:
The customization area is colored purple. There are three variables with values that can be customized. The lines with the variables are colored red.
-
$URLofDownloadableFile = "/downloads/thedoc.zip"
Change
/downloads/thedoc.zip
to the URL of the file to be downloaded when the download page is loaded into a browser. The URL may be an absolute http://… or https://… URL. Or, it may be a relative URL (as is the example). -
$LocationOfLogFile = "/downloads/log/log.csv";
If you wish to maintain a download log file, change
/downloads/log/log.csv
to the location where the file is to be maintained. The download log file is a CSV file. (The subdirectories for the CSV file must already exist and be writable. The CSV file is created automatically.)On the other hand, if you do not wish to maintain a download log file, remove
/downloads/log/log.csv
. You would then end up with$LocationOfLogFile = "";
-
$LocationOfCountFile = "/downloads/log/count.txt";
If you wish to keep a count of the number of downloads, change
/downloads/log/count.txt
to the location where the counting file is to be maintained. (The subdirectories for the count file must already exist and be writable. The count file is created automatically.) The count file does not maintain a number. Instead, it appends anx
into the file every time a file is downloaded. Thus, the file size is the number of downloads.(The reason for appending an
x
to the file with every download is because it is at least twice as fast and also more reliable than (i) reading the file to obtain the last number, (ii) incrementing the number, then (iii) writing the number back to the file. It is more reliable because virtually simultaneous downloads from two or more browsers could cause an error in the count when the last number in the file is read a second time before the first time has a chance to write the incremented number. Getting the count is also easier — simply get the file size instead of opening and reading the file.)On the other hand, if you do not wish to have a count of downloads available, remove
/downloads/log/count.txt
. You would then end up with$LocationOfCountFile = "";
When your customization is complete, it is ready to insert into the HEAD area of the download page source code.
Additional Options
At the download page (with the above-mentioned PHP code installed), two optional features may be published in the BODY area.
Feature One —
Some browsers have a preference setting that allows the user to block redirects. For those, the meta tag will not work — it is, in essence, a redirect tag.
To accomodate those, the web page may contain something like this in its source code.
<p>
If download does not start presently,
<a href="<?php echo($URLofDownloadableFile) ?>">
tap here.
</a>
</p>
The <?php echo($URLofDownloadableFile) ?>
PHP code automatically inserts the URL of the downloadable file into the link. The person can tap on "tap here" and download the file.
Feature Two —
If you wish to publish the download count on the download page, the <?php echo(filesize($LocationOfCountFile)) ?>
PHP code automatically prints the number. It may be implemented like this:
<p>
Number of downloads: <?php echo(filesize($LocationOfCountFile)) ?>
</p>
When this system is implemented, your download page initiates the download when the page is loaded into the browser. Optionally, the following can be implemented:
- Maintain download log file.
- Update download count file.
- Publish direct download link.
- Publish current download count.
Test the page to verify it works as it should, with the options you want. Then it's ready for the public or people you privately direct to the page.
(This article first appeared with an issue of the Possibilities newsletter.)
Will Bontrager