Skip to content

Instantly share code, notes, and snippets.

@SniperSister
Last active November 30, 2023 11:08
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
Star You must be signed in to star a gist
Embed
What would you like to do?
readmedia.php for Joomla 4 and 5
<?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_BASE . '/includes/framework.php';
/* Create the Application */
$container = \Joomla\CMS\Factory::getContainer();
$container->alias('session.web', 'session.web.site')
->alias('session', 'session.web.site')
->alias('JSession', 'session.web.site')
->alias(\Joomla\CMS\Session\Session::class, 'session.web.site')
->alias(\Joomla\Session\Session::class, 'session.web.site')
->alias(\Joomla\Session\SessionInterface::class, 'session.web.site');
// Instantiate the application.
$app = $container->get(\Joomla\CMS\Application\SiteApplication::class);
// Load the extension Namespaces
\JLoader::register('JNamespacePsr4Map', JPATH_LIBRARIES . '/namespacemap.php');
$extensionPsr4Loader = new \JNamespacePsr4Map();
$extensionPsr4Loader->load();
// Set the application as global app
\Joomla\CMS\Factory::$application = $app;
// Actual permission check starts here
if (!\Joomla\CMS\Factory::getUser()->id)
{
header("HTTP/1.0 403 access denied");
echo "Access denied";
exit();
}
$requestedFile = urldecode(str_replace(\Joomla\CMS\Uri\Uri::root(), "", \Joomla\CMS\Uri\Uri::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;
}
@HorstGgithub
Copy link

Was ich leider nicht ganz verstehe, wo muss die PHP Datei hin?

Auch in den Ordner wo die Downloads sind oder ins root?

Ich hab einen Ordner in Images erstellt, sagen wir mal intern

in den Ordner intern hab ich die htaccess erstellt mit den Inhalt von der verlinkten Seite, nur das ich halt meinen Ordner anstatt downloads angegeben hab

Und dann habe ich mir den PHP Code kopiert und eine readmedia.php mit diesen Inhalt erstellt und hochgeladen, aber egal ob ich die in den root lade oder in den intern Ordner, ich kann die z.B. pdf weiterhin einfach aufrufen!

@SniperSister
Copy link
Author

@HorstGgithub
Copy link

Hi David,
Ich denke die Frage stellen sich aber vielleicht auch andere die das Skript hier finden. In der Beschreibung steht ja leider nirgends wo die Dateien hin gehören. Für jeden erschließt es sich halt nicht direkt - siehe mich ;-)

@SniperSister
Copy link
Author

@HorstGgithub worauf ich hinaus will: doppelte Fragen ohne Querverweis bedeutet ggf. doppelten Aufwand für die Beantwortung, deswegen gehört zumindest ein Hinweis darauf, dass man die Frage nochmal woanders gestellt hat, zum guten Ton

@galgenjunge
Copy link

galgenjunge commented Nov 30, 2023

Hi,

leider funktioniert die Lösung nicht auf Smartphones. Dort wird immer ein "Access denied" ausgeben.

  • Aktuelle Joomla Version 5.0.1
  • Testgeräte: iPhone und Samsung (Android)

Eine Idee, was das Problem sein könnte?

--
P.s: leider ist es auch möglich Files wie PHP Dateien anzeigen zulassen.

@SniperSister
Copy link
Author

das script arbeitet ausschließlich serverseitig und macht keinen Unterschied zwischen verschiedenen Gerätetypen, da hab ich keine Idee zu

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment