Baumeister Mediasoft Engineering BME - Baumeister Mediasoft Engineering  PHP Application: File Download Utilities - English Version PHP-Anwendung: Utilities zum Dateidownload - Deutsche Version
Baumeister Mediasoft Engineering
Bartels AutoEngineerCarLogDienstleistungenRessourcenFirmenprofilKontakt
Baumeister Mediasoft Engineering » Ressourcen » Webentwicklung » PHP » Applikationen » Download
PHP-Anwendungen

PHP-Anwendung: Utilities zum Dateidownload

PHP - PHP Hypertext Preprocessor

Dateidownload-Funktion

PHP-Anwenderfunktion zum Dateidownload ohne öffentliche URL:

<?php
function DownloadFile($filename)
{
    
// Check filename
    
if (empty($filename) || !file_exists($filename))
    {
        return 
FALSE;
    }
    
// Create download file name to be displayed to user
    
$saveasname basename($filename);
    
// Send binary filetype HTTP header
    
header('Content-Type: application/octet-stream');
    
// Send content-length HTTP header
    
header('Content-Length: '.filesize($filename));
    
// Send content-disposition with save file name HTTP header
    
header('Content-Disposition: attachment; filename="'.$saveasname.'"');
    
// Output file
    
readfile($filename);
    
// Done
    
return TRUE;
}
?>

Dateidownload-Script

PHP-Script zum Dateidownload ohne öffentliche URL:

<?php
//////////////////////////////////////////////////////////////////////
// DOWNLOAD.PHP -- Download Utility
// Copyright (c) 2001-2006 Manfred Baumeister, Dublin, Ireland
//
// AUDIT TRAIL:
//    mb (03/02/2004) Bugfix/Patch: Call to getGlobalVar('id', 1) fixed.
//    mb (26/12/2003) Modified download file id parameter access.
//    mb (26/12/2003) BUGFIX: Syntax error (missing ')' in line 13) fixed.
//    mb (15/09/2003) getGlobalVar function added/facilitated.
//    mb (05/10/2002) PHP 4.2 global variable access.
//////////////////////////////////////////////////////////////////////

// Get download file id (assume it's passed as a form or URL parameter)
$id getGlobalVar('id'1);

// Check download file id parameter, get download file name, download file
// (assuming (global) variable $id specifies download file id)
if (empty($id) || !DownloadFile(getDownloadFileName($id)))
{
    die(
"No Download!");
}

// Only functions beyond this point

function getDownloadFilename($fileid)
// Get download file pathname
// Returns: download file pathname
// Parameters:
//    $fileid : File identifier
{
    
// Download file list
    
$DLFILES = array(
        
'TOOL1' => 'download/tool1_v30.exe',
        
'PROG2' => 'download/prog2setup.exe',
        );
    
// Get/check download file name
    
if (empty($fileid) || empty($DLFILES[$fileid]))
    {
        return 
'';
    }
    
// Set base directory to document root directory
    // (could also be set to a directory outside document root!)
    
$basedir getGlobalVar('DOCUMENT_ROOT');
    
// Build and return download file name
    
return $basedir.'/'.$DLFILES[$fileid];
}

function 
DownloadFile($filename)
// Download file
// Returns: TRUE if download successfully started, FALSE if download failed
// Parameters:
//    $filename : Download file pathname
{
    
// Verify filename
    
if (empty($filename) || !file_exists($filename))
    {
        return 
FALSE;
    }
    
// Create download file name to be displayed to user
    
$saveasname basename($filename);
    
// Send binary filetype HTTP header
    
header('Content-Type: application/octet-stream');
    
// Send content-length HTTP header
    
header('Content-Length: '.filesize($filename));
    
// Send content-disposition with save file name HTTP header
    
header('Content-Disposition: attachment; filename="'.$saveasname.'"');
    
// Output file
    
readfile($filename);
    
// Download successfully started
    
return TRUE;
}

function 
getGlobalVar($g$formflag 0)
// Get global PHP variable value
// Returns: global variable value or empty string if not available
// Parameters:
//  $g        : Global PHP variable name
//  $formflag : Flag - global var from GET/POST input
{
    if (empty(
$g))
    {
        return 
0;
    }
    
// Try superglobal access (PHP 4.1.0+)
    
if ($formflag)
    {
        if (isset(
$_POST[$g]))
        {
            return 
$_POST[$g];
        }
        if (isset(
$_GET[$g]))
        {
            return 
$_GET[$g];
        }
        if (isset(
$_REQUEST[$g]))
        {
            return 
$_REQUEST[$g];
        }
    }
    else
    {
        if (isset(
$_SERVER[$g]))
        {
            return 
$_SERVER[$g];
        }
        if (isset(
$_ENV[$g]))
        {
            return 
$_ENV[$g];
        }
    }
    
// Try superglobal access (PHP 3.0.0+)
    
if (isset($GLOBALS[$g]))
    {
        return 
$GLOBALS[$g];
    }
    
// Try global variable access (PHP 3+)
    
global $$g;
    if (!empty($
$g))
    {
        return $
$g;
    }
    
// Assume global variable empty/not set
    
return '';
}
?>

Das obige Script erwartet den Parameter id zur Identifikation der Downloaddatei. Der Vorteil dieser Methode besteht darin, dass kein URL-Pfad zur Downloaddatei veröffentlicht werden muss. Der folgende Hypertextverweis aktiviert den Download der Datei prog2setup.exe wenn das obige Script unter http://www.YourDomain.com/dl.php abgelegt ist:

<a href="http://www.YourDomain.com/dl.php?id=PROG2">Download Program 2</a>

Bei Verwendung obiger Methode können Downloaddateien sogar außerhalb des öffentlich erreichbaren Webserver-Verzeichnisbereichs abgelegt werden. Damit ist es möglich, den Zugriff auf Downloaddateien vollständig zu kontrollieren. Der Download kann wahlweise auch automatisiert (d.h., ohne die Notwendigkeit zur Selektion eines spezifischen Links) durch ein PHP-Redirect-Statement wie in folgendem Script gestartet werden:

<?php
header
("Location: http://www.YourDomain.com/dl.php?id=PROG2");
exit;
?>

Die obige Methode ist nützlich, wenn Downloadzugriffe automatisch überwacht und aufgezeichnet werden sollen. Da der Zugriff auf die Downloaddatei nur über obiges PHP-Script möglich ist, können in diesem Script zusätzliche Hintergrundprozeduren (Downloadzähler, Webmaster-Notification, usw.) ausgelöst werden, wenn eine Downloaddatei angefordert wird. Es ist z.B. auch möglich, Downloadanforderungen nur über ein Formular (z.B. zur Benutzeridentifikation) freizugeben.

Bekannte Probleme

Die Verwendung des HTTP-Headers Content-disposition: attachment führt möglicherweise zu Problemen im Internet Explorer, speziell in IE5.5 SP1 und in IE6.01. Nähere Info zu den hierzu finden Sie über die Links. In der folgenden PHP-Anwenderfunktion zum Dateidownload wird eine Browserprüfung zur Umgehung dieser Fehler bzw. Probleme verwendet:

<?php
function DownloadFile($filename)
{
    
// Check filename
    
if (empty($filename) || !file_exists($filename))
    {
        return 
FALSE;
    }
    
// Create download file name to be displayed to user
    
$saveasname basename($filename);
    
// Send binary filetype HTTP header
    
header('Content-Type: application/octet-stream');
    
// Send content-length HTTP header
    
header('Content-Length: '.filesize($filename));
    
// Send content-disposition with save file name HTTP header
    // (using workaround for MSIE 5.5 SP1 / MSIE 6.01 bugs/problems)
    
$browser getGlobalVar('HTTP_USER_AGENT');
    if (
strstr('MSIE 5.5'$browser)
     || 
strstr('MSIE 6.01'$browser))
    {
        
header('Content-Disposition: filename="'.$saveasname.'"');
    }
    else
    {
        
header('Content-Disposition: attachment; filename="'.$saveasname.'"');
    }
    
// Send Content-Transfer-Encoding HTTP header
    // (use binary to prevent files from being encoded/messed up during transfer)
    
header('Content-Transfer-Encoding: binary');
    
// Output file
    
readfile($filename);
    
// Done
    
return TRUE;
}

function 
getGlobalVar($g$formflag 0)
// Get global PHP variable value
// Returns: global variable value or empty string if not available
// Parameters:
//  $g        : Global PHP variable name
//  $formflag : Flag - global var from GET/POST input
{
    if (empty(
$g))
    {
        return 
0;
    }
    
// Try superglobal access (PHP 4.1.0+)
    
if ($formflag)
    {
        if (isset(
$_GET[$g]))
        {
            return 
$_GET[$g];
        }
        if (isset(
$_POST[$g]))
        {
            return 
$_POST[$g];
        }
        if (isset(
$_REQUEST[$g]))
        {
            return 
$_REQUEST[$g];
        }
    }
    else
    {
        if (isset(
$_SERVER[$g]))
        {
            return 
$_SERVER[$g];
        }
        if (isset(
$_ENV[$g]))
        {
            return 
$_ENV[$g];
        }
    }
    
// Try superglobal access (PHP 3.0.0+)
    
if (isset($GLOBALS[$g]))
    {
        return 
$GLOBALS[$g];
    }
    
// Try global variable access (PHP 3+)
    
global $$g;
    if (!empty($
$g))
    {
        return $
$g;
    }
    
// Assume global variable empty/not set
    
return '';
}
?>
<?php
function DownloadFile($filename)
{
    
// Check filename
    
if (empty($filename) || !file_exists($filename))
    {
        return 
FALSE;
    }
    
// Create download file name to be displayed to user
    
$saveasname basename($filename);
    
// Send binary filetype HTTP header
    
header('Content-Type: application/octet-stream');
    
// Send content-length HTTP header
    
header('Content-Length: '.filesize($filename));
    
// Send content-disposition with save file name HTTP header
    // (using workaround for MSIE 5.5 SP1 / MSIE 6.01 bugs/problems)
    
$browser getGlobalVar('HTTP_USER_AGENT');
    if (
strstr('MSIE 5.5'$browser)
     || 
strstr('MSIE 6.01'$browser))
    {
        
header('Content-Disposition: filename="'.$saveasname.'"');
    }
    else
    {
        
header('Content-Disposition: attachment; filename="'.$saveasname.'"');
    }
    
// Send Content-Transfer-Encoding HTTP header
    // (use binary to prevent files from being encoded/messed up during transfer)
    
header('Content-Transfer-Encoding: binary');
    
// Output file
    
readfile($filename);
    
// Done
    
return TRUE;
}

function 
getGlobalVar($g$formflag 0)
// Get global PHP variable value
// Returns: global variable value or empty string if not available
// Parameters:
//  $g        : Global PHP variable name
//  $formflag : Flag - global var from GET/POST input
{
    if (empty(
$g))
    {
        return 
0;
    }
    
// Try superglobal access (PHP 4.1.0+)
    
if ($formflag)
    {
        if (isset(
$_GET[$g]))
        {
            return 
$_GET[$g];
        }
        if (isset(
$_POST[$g]))
        {
            return 
$_POST[$g];
        }
        if (isset(
$_REQUEST[$g]))
        {
            return 
$_REQUEST[$g];
        }
    }
    else
    {
        if (isset(
$_SERVER[$g]))
        {
            return 
$_SERVER[$g];
        }
        if (isset(
$_ENV[$g]))
        {
            return 
$_ENV[$g];
        }
    }
    
// Try superglobal access (PHP 3.0.0+)
    
if (isset($GLOBALS[$g]))
    {
        return 
$GLOBALS[$g];
    }
    
// Try global variable access (PHP 3+)
    
global $$g;
    if (!empty($
$g))
    {
        return $
$g;
    }
    
// Assume global variable empty/not set
    
return '';
}
?>

Links

Baumeister Mediasoft Engineering » Ressourcen » Webentwicklung » PHP » Applikationen » Download

PHP-Anwendung: Utilities zum Dateidownload • © 2019 Manfred Baumeister • Aktualisiert: 31. Juli 2010, 17:43 [UTC]

Baumeister Mediasoft Engineering, Clontarf, Dublin 3, D03 HA22, Irland
© 2019 Manfred Baumeister

PHP Application: File Download Utilities - English Version PHP-Anwendung: Utilities zum Dateidownload - Deutsche Version