 |
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;
}
?>
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.
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 '';
}
?>
PHP-Anwendung: Utilities zum Dateidownload • © 2012 Manfred Baumeister • Aktualisiert: 31. Juli 2010, 17:43 [GMT]
|