Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
<?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;
if (isset($_SERVER['HTTP_RANGE']))
{
if (preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER['HTTP_RANGE'], $matches))
{
$begin = intval($matches[0]);
if (!empty($matches[1]))
{
$end = intval($matches[1]);
}
}
}
if ($begin > 0 || $end < $size)
{
header('HTTP/1.0 206 Partial Content');
}
else
{
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('Accept-Ranges: bytes');
header('Content-Length:' . ($end - $begin));
header("Content-Range: bytes $begin-$end/$size");
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;
}
@oldpixelman

This comment has been minimized.

Copy link

@oldpixelman oldpixelman commented Mar 6, 2019

Wo genau muss dieses Script readmedia.php eingefügt werden?

@Kubik-Rubik

This comment has been minimized.

Copy link

@Kubik-Rubik Kubik-Rubik commented Mar 17, 2019

Wo genau muss dieses Script readmedia.php eingefügt werden?

Es kommt drauf an, wie du es in deiner Rewrite-Regel in der .htaccess definierst. Siehe die Anleitung hier: https://www.djumla.de/blog/geschuetzte-downloads-in-joomla

@kmuehlemann

This comment has been minimized.

Copy link

@kmuehlemann kmuehlemann commented Oct 22, 2020

Das Script macht im Prinzip, was ich brauche. Leider funktioniert es bei mir nur partiell. Da ich php nicht kenne, kann ich das Script nicht genügend interpretieren.
Meine Ordnerstruktur lautet:
joomla/
____/...
____/Dokumente
________/ ... # public
________/Mitgliederbereich # restricted
____________/Mitgliederverzeichnis # restricted
________________Mitgliederliste.pdf
____________/Protokolle2020 # restricted
________________Protokoll1.pdf
____________/Protokolle2019 # restricted
________________Protokoll2.pdf

Das Script funktioniert, wenn es um die Datei Mitgliederliste.pdf geht. Bei direktem Zugriff kommt "Access denied". Auch beim direkten Zugriff auf Protokoll1.pdf oder Protokoll2.pdf kommt "Access denied". Problem: Der eingeloggte User erhält durch Anklicken des entsprechenden Links Zugriff auf die Mitgliederliste.pdf (OK), nicht aber auf Protokoll1.pdf oder Protokoll2.pdf. Das Script meldet in diesen zwei Fällen "File not found" statt die Datei zu öffnen. Offenbar zeigt der Link nun ins Leere. Überprüft habe ich, dass Protokoll1.pdf und Protokoll2.pdf auch nicht gefunden werden, wenn ich sie ins Verzeichnis /Mitgliederverzeichnis kopiere.

readmedia.php habe ich im Verzeichnis Joomla platziert. Die .htaccess-Datei habe ich gemäss dem oben erwähnten Blog mit der Zeile "RewriteRule ^Dokumente\/Mitgliederbereich\/.*$ readmedia.php [L]" ergänzt.

Was mache ich falsch?

@SniperSister

This comment has been minimized.

Copy link
Owner Author

@SniperSister SniperSister commented Oct 22, 2020

Der Fehler kann eignetlich nur auftreten, wenn die Datei von PHP nicht gefunden wird - funktioniert es mit dem gleichen Aufruf ohne den Eintrag in der htaccess?

@kmuehlemann

This comment has been minimized.

Copy link

@kmuehlemann kmuehlemann commented Oct 22, 2020

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?

@TobiasBeck777

This comment has been minimized.

Copy link

@TobiasBeck777 TobiasBeck777 commented Oct 24, 2020

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!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.