Connecting Tech Pros Worldwide Help | Site Map

How to detect if file download completed or cancelled

 
LinkBack Thread Tools Search this Thread
  #1  
Old October 18th, 2006, 05:55 PM
Dan D
Guest
 
Posts: n/a
Default How to detect if file download completed or cancelled

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

  #2  
Old October 20th, 2006, 01:35 AM
petersprc@gmail.com
Guest
 
Posts: n/a
Default Re: How to detect if file download completed or cancelled

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:
Quote:
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
  #3  
Old October 23rd, 2006, 08:35 PM
Dan D
Guest
 
Posts: n/a
Default Re: How to detect if file download completed or cancelled

Thank you very much. That looks like it should work great. I'll give it
a try.
Dan

petersprc@gmail.com wrote:
Quote:
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:
>
Quote:
>>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
>
>
 

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

Popular Articles

What is Bytes?

We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights. Get the best answers to your questions from over 220,989 network members.