GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu zobrazit obrázky mimo kořenový adresář webu v mé aplikaci php?

PHP ve výchozím nastavení již může přistupovat k souborům mimo webový kořenový adresář, pokud není omezeno open_basedir direktiva (nebo bezpečný režim, ale doufám, že nejste v té kleci).

Obvykle je dobrým zvykem vložit do konfigurace VirtualHost open_basedir omezení. Můžete zadat více adresářů oddělených : v systému Linux a ; v systému Windows.

php_admin_value open_basedir /var/www/s/stage:/usr/share/php:/your/dir

Pro přístup k těmto souborům použijte buď absolutní cestu, nebo cestu relativní k pozici volaného souboru PHP. (Budete tedy muset ../ k dosažení výše uvedených úrovní).

Také se ujistěte, že adresáře, do kterých chcete zapisovat, jsou přiřazeny uživateli webového serveru a mají oprávnění k zápisu.

Jinak máte druhou možnost:

V adresáři www vytvořte soubor „image.php“ s podobným obsahem jako:

<?php
  header('Content-Type: image/png');
  readfile("../img/" . $_GET['img']);
?>

A volejte své obrázky pomocí

<img src="image.php?img=myimage.png" />

Uvědomte si prosím, že váš soubor PHP by neměl být tak jednoduchý :) Protože možná budete chtít řešit více formátů obrázků (a poskytnout jim správnou hlavičku), zkontrolujte cestu/zahrnutí škodlivého souboru (nechcete použít $ _GET bez ověření/dezinfekce vstupu), další ukládání do mezipaměti atd. atd. atd.

To by vám však mělo poskytnout představu, jak můžete svůj problém zacílit.


Jak je to jednoduché, zobrazí se obrázek se správnými záhlavími,
pamatujte, že před vyprázdněním čehokoli z výstupní vyrovnávací paměti musíte nastavit header().
=> bez ozvěny nebo tisku dříve

$file = '../../somedirectory/image.jpg';
header('Content-Type:image/jpeg');
header('Content-Length: '.filesize($file));
echo file_get_contents($file);

Pro mou aplikaci žádná z těchto odpovědí nefungovala - jednoduše jsem nemohl zobrazit obrázek a nebylo pro mě opravdu možné přidat nový soubor php, který bych měl volat z důvodů. Co pro mě DID fungovalo, je

$filename = read_filename_from_database;
$fileDir = "/path/to/files/";
$file = $fileDir . $filename;
if (file_exists($file))
{
     $b64image = base64_encode(file_get_contents($file));
     echo "<img src = 'data:image/png;base64,$b64image'>";
}

Linux
  1. Jak zobrazit úplnou cestu k souboru nebo adresáři v terminálu?

  2. Jak může moje aplikace C/C++ určit, zda uživatel root provádí příkaz?

  3. Jak změním kořenový adresář serveru Apache?

  1. Jak mohu spustit kód PHP z příkazového řádku?

  2. Jak mohu uvést (ls) posledních 5 upravených souborů v adresáři?

  3. Jak nakonfigurovat příkazový řádek v Linuxu tak, aby zobrazoval aktuální adresář?

  1. Jak fungují vnitřnosti sudo?

  2. Jak nainstalovat R 3.3.1 do vlastního adresáře?

  3. Jak mohu skrýt výstup shellové aplikace v Linuxu?