Hello Walle,
ich habe nochmal ein bisschen gebastelt.
Dabei habe ich gesehen, dass es äußerst bedauerlich ist, dass $php_errormsg nicht global vereinbart ist Dann könnte man sich die lästige Schreibarbeit mit $MYERRORMSG nämlich schenken. Zeigt mal wieder, dass PHP kein durchgängiges Konzept hat :-((
<?php ### download_file.php ### utf-8 ### ÄÖÜäöü
ini_set('track_errors', true);
$MYERRORMSG = false;
#--------------------------------------------------------------------------------------------------
function get_mime_type($path)
{
GLOBAL $MYERRORMSG;
if (version_compare(PHP_VERSION, '5.3.0') < 0)
{
$MYERRORMSG = $php_errormsg;
return false;
}
if (!function_exists('finfo_open'))
{
$MYERRORMSG = $php_errormsg;
return false;
}
if (!$finfo = finfo_open(FILEINFO_MIME_TYPE))
{
$MYERRORMSG = $php_errormsg;
return false;
}
$mime_type = finfo_file($finfo, $path);
finfo_close($finfo);
return $mime_type;
}
#--------------------------------------------------------------------------------------------------
function download_file($filename, $attachment = false)
{
GLOBAL $MYERRORMSG;
$disposition = ($attachment?'attachment':'inline');
if (! $fh = @fopen($filename, 'rb'))
{
$MYERRORMSG = $php_errormsg;
return false;
}
if (! @flock($fh, LOCK_SH))
{
$MYERRORMSG = $php_errormsg;
return false;
}
if (! $mimetype = @get_mime_type($filename))
{
$MYERRORMSG = $php_errormsg;
return false;
}
header("Content-Type: $mimetype;");
header('Content-Disposition: ' . $disposition . '; filename="' . basename($filename) . '"');
fpassthru($fh);
# fclose($fp); übernimmt PHP für uns in diesem Fall durch Verlassen des Funktionsblockes
exit;
}
#================================================================================================
# php main
#================================================================================================
download_file('Aufgabe.pdf');
if ($MYERRORMSG) echo "<p>Letzter Fehler: $MYERRORMSG</p>\r\n";
?>
So ist das jetzt auch Race-Condition-fest, wenn gerade jemand was ändern will, während noch jemand runterlädt, vorausgesetzt, man nutzt für den Upload auch einen POSIX-konformen (FTP-)Client bzw. Prozess/Script.
Den Download könnte man nun auch noch Cache-freundlich gestalten, so dass die Dokumente nur runtergeladen werden, wenn sie erneuert worden sind. PDFs sind ja ganz schöne Klötze, und warum soll man die bei jedem "ich schau nochmal" des users erneut runterladen?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg