|
Posted by petersprc on 10/20/06 01:53
You could check the byte count in the web server log to see if the
whole file was transferred.
In PHP, you could also do this by checking connection_aborted() after
sending the file. For example:
ignore_user_abort(true); // Don't end if the connection breaks
if (readfile($path) !== false && !connection_aborted()) {
// Success!
}
Here's a larger example. The function sendFile returns the status of
the download:
<?
// Sample usage
function sendTest()
{
$res = sendFile('application.exe', 'application/octet-stream');
if ($res['status']) {
// Download succeeded
} else {
// Download failed
}
@saveDownloadStatus($res);
}
// The sendFile function streams the file and checks if the
// connection was aborted.
function sendFile($path, $contentType = 'application/octet-stream')
{
ignore_user_abort(true);
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename="' .
basename($path) . "\";");
header("Content-Type: $contentType");
$res = array(
'status' => false,
'errors' => array(),
'readfileStatus' => null,
'aborted' => false
);
$res['readfileStatus'] = readfile($path);
if ($res['readfileStatus'] === false) {
$res['errors'][] = 'readfile failed.';
$res['status'] = false;
}
if (connection_aborted()) {
$res['errors'][] = 'Connection aborted.';
$res['aborted'] = true;
$res['status'] = false;
}
return $res;
}
// Save the status of the download to some place
function saveDownloadStatus($res)
{
$ok = false;
$fh = fopen('download-status-' . $_SERVER['REMOTE_ADDR'] . '-' .
date('Ymd_His'), 'w');
if ($fh) {
$ok = true;
if (!fwrite($fh, var_export($res, true))) {
$ok = false;
}
if (!fclose($fh)) {
$ok = false;
}
}
return $ok;
}
Dan D wrote:
> I have a large install file (an exe) on my web server that people
> download and install from. Looking at my log files, I see a lot of
> people downloading it, but no way to tell for sure if they completed the
> download or cancelled out before it completed. Is there any function in
> PHP that would allow the web server to send the file and detect a
> completion or cancellation? Or perpahs a javascript/PHP method?
>
> Any help would be greatly appreciated.
> Thanks,
> Dan
Navigation:
[Reply to this message]
|