Имя: Пароль:
IT
Веб-мастеринг
PHP - как вывести картинку из закрытой директории
,
0 vde69
 
02.01.20
11:31
PHP - как вывести картинку из закрытой директории.

в смысле - она доступна для скрипта PHP, но не доступна для клиента по этому не работает вариант.
То есть домашний каталог сайта это параллельная ветка с шарой на которой лежат картинки

echo "<img src='/i-data/d2761c3e/photo/DSC00152.JPG' />";

вариант который везде предлагают (c base64, и на который я убил 2 дня) не работает из-за ограничений размера данных (почему-то ни одна сволочь не пишет, про это, пока сам нашел чуть не позеленел), то есть в страничке данные в base64 есть и они нормальные а вот на экран не выводятся...

$file = '/i-data/d2761c3e/photo/DSC00152.JPG';
$path = pathinfo($file);
$ext = mb_strtolower($path['extension']);
if (in_array($ext, array('jpeg', 'jpg', 'gif', 'png', 'webp', 'svg'))) {      
    if ($ext == 'svg') {
        $img = 'data:image/svg+xml;base64,' . base64_encode(file_get_contents($file));
    } else {
        $size = getimagesize($file);
        $datimg_1 = file_get_contents($file);
        $datimg_2 = base64_encode($datimg_1);
        $img = 'data:' . $size['mime'] . ';base64,' . $datimg_2;
    }
}

echo "<style> .logo { background: url(".$img.") } </style>";
echo "<div class='logo'></div>";


есть еще мысля сделать симлинк, но пока это только мысли и наверно последняя надежда, которая то-же может лопнуть.
1 Garykom
 
гуру
02.01.20
11:36
2 Garykom
 
гуру
02.01.20
11:37
(1)+ перед этим
header('Content-type: image/jpg');
в своем скрипте отдельном php который картинки будет "проксировать" из каталога
3 Garykom
 
гуру
02.01.20
11:39
<?PHP
$file = '/i-data/d2761c3e/photo/DSC00152.JPG';
header('Content-type: image/jpg');
echo file_get_contents($file);
?>

Как будешь имя картинки запрашиваемое в скрипт передавать уже сам думай
4 vde69
 
02.01.20
11:42
(3) эти варианты не работают !!! точнее работают на маленьких файлах и не работают на больших. Подобных вариантов я перепробовал штук 8....

я-же в (0) написал, что передача по base64 имеет ограничение по размеру строки...
5 vde69
 
02.01.20
11:44
(3) кроме всего прочего в динамическом сайте вставлять заголовок можно только самой первой операцией, а у меня до вывода картинки килограмм кода....
6 vde69
 
02.01.20
11:45
(5) а без заголовка код из (3) будет выводить только кракозябры
7 Garykom
 
гуру
02.01.20
11:46
(4) А пробовал именно вот этот простой вариант?

Возможны проблемы если у тебя iis или кривые настройки веб-сервера, но тут никак не обойти путем php
8 Garykom
 
гуру
02.01.20
11:47
(5) Ты не понял! Отдельный php скрипта который выдает только одну картинку!
А в своем основном вставляешь адрес этого срипта вместо адреса картинки

echo "<img src='getimg.php' />";
9 Garykom
 
гуру
02.01.20
11:49
(8)
echo "<img src='getimg.php?filename=DSC00152.JPG' />";
10 vde69
 
02.01.20
11:54
(8) пробовал, правда я не уверен, что у меня корректно подцепился этот отдельный скрипт, там его устанавливать надо... но суть не в этом, дело в том, что PHP выдает текстовую страничку и любая попытка вставить туда данные приводит или к конвертации их в бейс64 (для этого и нужен конткст что-бы правильно конвертнуло) или использованию переменных заголовка для динамического получения данных, у меня оба варианта не работают...
11 Asmody
 
02.01.20
11:55
(0) вообще-то, такие вопросы решаются настройкой веб-сервера.
Прилепи виртуальный каталог и все.
12 vde69
 
02.01.20
11:55
(10) +
мой вариант из (0) не требует указания контекста при конвертации, так как ее делает сам и явно
13 Garykom
 
гуру
02.01.20
12:01
все же попробуй так

getimg.php:
<?php
    $_GET["filename"]
    $file = '/i-data/d2761c3e/photo/' . _GET["filename"];
    header('Content-Type: image/jpeg');
    header('Content-Length: ' . filesize($file));
    echo file_get_contents($file);
?>

твой php:
echo "<img src='getimg.php?filename=DSC00152.JPG' />";
14 Garykom
 
гуру
02.01.20
12:01
(13) тьфу не удалил
getimg.php:
<?php
    $file = '/i-data/d2761c3e/photo/' . _GET["filename"];
    header('Content-Type: image/jpeg');
    header('Content-Length: ' . filesize($file));
    echo file_get_contents($file);
?>
15 vde69
 
02.01.20
12:02
(11)
типа в httpd.conf:

Alias /i_photo/ "/i-data/d2761c3e/photo/"

<Directory "/i-data/d2761c3e/photo/">
Options Indexes FollowSymlinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>

и дальше
echo "<img src='/i_photo/DSC00152.JPG' />"
16 Garykom
 
гуру
02.01.20
12:03
(14) забыл $

getimg.php:
<?php
    $file = '/i-data/d2761c3e/photo/' . $_GET["filename"];
    header('Content-Type: image/jpeg');
    header('Content-Length: ' . filesize($file));
    echo file_get_contents($file);
?>
17 Garykom
 
гуру
02.01.20
12:05
Алиасы хорошая штука но не всегда их можно прилепить, например если каталоги берутся из настроек из базы или из файлов куда пишутся админкой или чем то внешним.
18 vde69
 
02.01.20
12:10
с (15) у меня то-же проблеммы, после перезагрузки файл httpd.conf востанавливается, то есть надо заморачиватся или с кроном или еще как... короче не понятно
19 Asmody
 
02.01.20
12:16
(18) чудо-хостинг? Там какая-нибудь панель управления стоит?
20 Garykom
 
гуру
02.01.20
12:20
Лично я от апача стараюсь отказаться, уже давно nginx умеет php
21 vde69
 
02.01.20
12:29
(19) это NAS, и сильно его крутить совсем не охота,

в нем стоит wordpress 4.4
и твинки, мне надо подружить каталоги твинки с мини порталом который на вордпрессе
22 Garykom
 
гуру
02.01.20
12:34
(21) Ё мое, точно nas же крутил.
Короче в очередной раз убеждаюсь что лучше открытую железку иметь типа малинки или апельсинки.
23 Garykom
 
гуру
02.01.20
12:36
(18) Кста а свой скрипт то при запуске можно? Так сделай чтобы правил или заменял httpd.conf после ребута.
24 vde69
 
02.01.20
12:40
ура !!! получилось :)


        $scirpt_path = plugins_url('/pict.php', __FILE__);
        echo "<img src='".$scirpt_path."?filename=DSC00152.JPG' />";

короче полный путь до скрипта нужен, с указанием сервера
25 Garykom
 
гуру
02.01.20
12:45
Это когда 1С на этом NAS запускать будешь скажи ))
26 vde69
 
02.01.20
12:48
(22) а я наоборот убежден в обратном, готовое устройство оно сбалансировано, я-бы апельсинку уже убил раз десять....

тут главное понимать, что все хотелки надо решать тем что есть а не тем, что хочется... я думаю, что для тебя это не должно быть проблемой, судя по всему ты видел DOS :)
27 vde69
 
02.01.20
12:49
(25) никогда не буду, я четко понимаю, что NAS != Server
28 Garykom
 
гуру
02.01.20
12:52
(26) (27) Вот а на апельсинке или малинке можно 1С запускать, жаль только что пока только мобильную под андроид, для линукс под arm нет сборок 1С еще.
29 Asmody
 
02.01.20
13:13
(27) Да ладно! Относительно последние синьки даже докера пускать умеют.
30 dmitryds
 
02.01.20
16:41
31 dmitryds
 
02.01.20
16:42
(31) + вся соль в блочном чтении и отдаче

if ($fd = fopen($file, 'rb')) {
      while (!feof($fd)) {
        print fread($fd, 1024);
      }
      fclose($fd);
    }