<?php | |
/** | |
* @version 1.0.0 | |
* @package Readmedia | |
* @copyright Copyright (C) 2018 David Jardin - djumla GmbH | |
* @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> | |
* @link http://www.djumla.de | |
*/ | |
/* Initialize Joomla framework */ | |
define('_JEXEC', 1); | |
// Load system defines | |
if (file_exists(dirname(__FILE__) . '/defines.php')) | |
{ | |
require_once dirname(__FILE__) . '/defines.php'; | |
} | |
if (!defined('_JDEFINES')) | |
{ | |
define('JPATH_BASE', dirname(__FILE__)); | |
require_once JPATH_BASE . '/includes/defines.php'; | |
} | |
require_once JPATH_LIBRARIES . '/import.legacy.php'; | |
require_once JPATH_LIBRARIES . '/cms.php'; | |
// Load the configuration | |
require_once JPATH_CONFIGURATION . '/configuration.php'; | |
/* Create the Application */ | |
$mainframe = JFactory::getApplication('site'); | |
/**************************************************/ | |
// Your code starts here... | |
/**************************************************/ | |
if (!JFactory::getUser()->id) | |
{ | |
header("HTTP/1.0 403 access denied"); | |
echo "Access denied"; | |
exit(); | |
} | |
$requestedFile = str_replace(JUri::root(), "", JUri::current()); | |
$location = dirname(__FILE__) . "/" . $requestedFile; | |
if (!file_exists($location)) | |
{ | |
header("HTTP/1.0 404 file not found"); | |
echo "File not found"; | |
exit(); | |
} | |
$size = filesize($location); | |
$time = date('r', filemtime($location)); | |
$fm = @fopen($location, 'rb'); | |
if (!$fm) | |
{ | |
header("HTTP/1.0 505 Internal server error"); | |
exit(); | |
} | |
$begin = 0; | |
$end = $size; | |
header('HTTP/1.0 200 OK'); | |
header("Content-Type: " . mime_content_type($location)); | |
header('Cache-Control: public, must-revalidate, max-age=0'); | |
header('Pragma: no-cache'); | |
header("Content-Disposition: inline; filename=" . basename($location)); | |
header("Content-Transfer-Encoding: binary\n"); | |
header("Last-Modified: $time"); | |
header('Connection: close'); | |
$cur = $begin; | |
fseek($fm, $begin, 0); | |
while (!feof($fm) && $cur < $end && (connection_status() == 0)) | |
{ | |
print fread($fm, min(1024 * 16, $end - $cur)); | |
$cur += 1024 * 16; | |
} |
Bei mir funktioniert das Skript einwandfrei auch für tiefe Unterverzeichnisse (Vielen Dank!).
Testweise könnte man auf Zeile 52 Folgendes einfügen:
echo $location;
Damit sollte vor dem 'file not found' herausgeschrieben werden, bei welchem Pfad genau den die php-Funktion file_exists meint, dass es die dahinterliegende Datei nicht gäbe. Falls man diesen Pfad aufrufen kann, wenn testweise readmedia nicht aktiviert ist, dann könnte es auf ein Problem mit dem Script hinweisen. Falls es nicht geht, dann sollte das Script korrekt arbeiten.
Wichtig: Diese Zeile nachher wieder löschen!
Hallo,
bei mir funktioniert das Script soweit, aber: Die Datei wird dann nicht zum download angeboten (kein downloadfenster), sondern direkt im Browser dargestellt. Dies passiert bei allen im Browser darstellbaren Dateitypen wie .csv oder .xlsx und nur in Verwendung mit dem Script.
Ohne das Script wird die Datei ganz normal heruntergeladen.
Warum bzw. wie kann ich das ändern? Ich hätte gerne, dass die Datei auch mit dem Script heruntergeladen wird.
Kann mir jemand helfen?
@tschombes das kann über das download Attribut in der Verlinkung erzwungen werden:
https://developer.mozilla.org/de/docs/Web/HTML/Element/a#attr-download
@SniperSister kann man das nicht auch über das Script regeln? Sonst müsste ich ja jeden einzelnen Downloadlink anpassen.
Wie gesagt, ohne das Script dazwischen funktioniert es.
Dann mal probieren ob es hilft aus dem Content-Disposition: inline
ein Content-Disposition: attachment
zu machen @tschombes
Vielen Dank für die Lösung!
Klappt super und dann noch in der htaccess bei der Übergabe für den Verzeichnisschutz Parameter für die Gruppen dran hängen und schon kann man bestimmte Bereiche für bestimmte Gruppen freigeben. :)
Danke SniperSister
Ohne den Eintrag in der .htaccess können alle Dateien über einen direkten Link ausgelesen werden, was nicht gut ist.
Mit dem Eintrag in der .htaccess ist der direkte Zugriff auf die Dateien aus dem Verzeichnis /Mitgliederverzeichnis verwehrt ("Access denied"). Bei den Dateien aus den Verzeichnissen /Protokolle20nn meldet Firefox bei direktem Zugriff: "Das PDF-Dokument wird eventuell nicht korrekt dargestellt".
Ich glaube also, dass die Datei readmedia.php gefunden wird, aber dass der Eintrag in der .htaccess nicht korrekt formuliert ist. Diesen habe ich nach bestem Willen gemäss Anleitung übernommen, resp. angepasst, verstehe aber nicht genau, was ich tue. Meine Verzeichnisstruktur ist wirklich so, wie ich sie dargestellt habe. Wie muss ich die verschiedenen Unterverzeichnisse von /Mitgliederbereich berücksichtigen? Kann mir hier jemand helfen?