Hi,
per PHP kann man das m.E. lösen. Anbei eine function, die ich mal irgendwo im Web gefunden und für meine Bedürfnisse angepasst hatte:
Code: Alles auswählen
function send_file_to_browser($filename_save, $mimetype, $dl_link, $dl_dir)
{
global $HTTP_USER_AGENT, $HTTP_SERVER_VARS;
$filename = ($dl_dir == '') ? $dl_link : $dl_dir . $dl_link;
$file_check = @fopen($filename, 'rb');
if ($file_check)
{ fclose($file_check); $check_ok = TRUE; }
else
{ $check_ok = FALSE; }
//
// Determine the Browser the User is using, because of some nasty incompatibilities.
// Most of the methods used in this function are from phpMyAdmin. :)
//
if (!empty($_SERVER['HTTP_USER_AGENT']))
{ $HTTP_USER_AGENT = $_SERVER['HTTP_USER_AGENT'];}
else if (!empty($HTTP_SERVER_VARS['HTTP_USER_AGENT']))
{ $HTTP_USER_AGENT = $HTTP_SERVER_VARS['HTTP_USER_AGENT']; }
else if (!isset($HTTP_USER_AGENT))
{ $HTTP_USER_AGENT = '';}
if (ereg('Opera(/| )([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version))
{ $browser_version = $log_version[2]; $browser_agent = 'opera';}
else if (ereg('MSIE ([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version))
{ $browser_version = $log_version[1]; $browser_agent = 'ie'; }
else if (ereg('OmniWeb/([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version))
{ $browser_version = $log_version[1]; $browser_agent = 'omniweb'; }
else if (ereg('Netscape([0-9]{1})', $HTTP_USER_AGENT, $log_version))
{ $browser_version = $log_version[1]; $browser_agent = 'netscape'; }
else if (ereg('Mozilla/([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version))
{ $browser_version = $log_version[1]; $browser_agent = 'mozilla'; }
else if (ereg('Konqueror/([0-9].[0-9]{1,2})', $HTTP_USER_AGENT, $log_version))
{ $browser_version = $log_version[1]; $browser_agent = 'konqueror'; }
else
{ $browser_version = 0; $browser_agent = 'other'; }
/*
// Correct the mime type - we force application/octetstream for all files, except images
// Please do not change this, it is a security precaution
if (!strstr($mimetype, 'image'))
{ $mimetype = ($browser_agent == 'ie' || $browser_agent == 'opera') ? 'application/octetstream' : 'application/octet-stream'; }
*/
//
// Correct the Mime Type, if it's an octetstream
//
if ( ($mimetype == 'application/octet-stream') || ($mimetype == 'application/octetstream') )
{
if ( ($browser_agent == 'ie') || ($browser_agent == 'opera') )
{ $mimetype = 'application/octetstream'; }
else
{ $mimetype = 'application/octet-stream'; }
}
//
// Now send the File Contents to the Browser
//
if ($check_ok)
{
//
// Send out the Headers
//
@ob_end_clean();
@ini_set('zlib.output_compression', 'Off');
header('Pragma: public');
header('Content-Transfer-Encoding: none');
// Send out the Headers
header('Content-Type: ' . $mimetype . '; name="' . $filename_save . '"');
header('Content-Disposition: inline; filename="' . $filename_save . '"');
$size = @filesize($filename);
if ($size)
{
header("Content-length: $size");
}
@readfile($filename);
}
else
{
// Fehlerausgabe
}
exit();
}
Mit der function wird der Download nämlich nicht als Link ausgegeben sondern direkt zum Download bereitgestellt, ohne dass der User nach meinem Kenntnisstand überhaupt eine Chance hat, den Downloadlink zu erfahren.
Du müsstest vor dem Aufruf der function den entsprechenden MIME-Typ übergeben (habe ich bei mir gleich beim Anlegen des Files in die DB eingetragen) und Du kannst vor dem Aufruf prüfen, ob der User überhaupt berechtigt ist. z.B. bei der PIN-Abfrage die IP in einer DB hinterlegen und prüfen, ob die IP desjenigen, der den Link aufruft, mit der in der DB identisch ist.
Aber: diese function solltest Du nur nutzen, wenn Du auf einem eigenen und sehr gute Server bist, denn die Datei wird eingelesen und dann an den User übertragen. Das kostet Performance.
Wenn Du mehr Infos brauchst, melde Dich bei mir.
CU
Frank-Andre