Имя: Пароль:
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);
    }
Основная теорема систематики: Новые системы плодят новые проблемы.