Извлечение случайных изображений из папки над папкой public_html

Поэтому я создал файл image.php с этим кодом и поместил его в свою папку public_html:

<?php
header('Content-Type: image/jpeg');
readfile('home/folder/my image.jpg');
?>

а затем я помещаю этот код на html-страницу в свою папку public_html:

<img src="/image.php">

который отлично отображал файл «my image.jpg» в моем браузере, когда я загружал страницу. Таким образом, это говорит мне, что у меня есть доступ к папке над моей папкой public_html (это выделенный сервер), и это говорит мне, что у меня нет проблем с рендерингом файла jpg с пробелами в имени файла.

Так что теперь я пытаюсь вытащить случайные изображения из той же папки, но не могу понять. Вот что я делаю, что НЕ работает.

Я создал файл image.php с этим кодом и поместил его в свою папку public_html:

<?php

//Define Function to Select Random Image
function random_pic($dir = '/home/folder')
{
$files = glob($dir . '/*.jpg');
$file = array_rand($files);
return $files[$file];
}

//Select Random Image Path
$randPic = random_pic('/home/folder');

//Output Random Image When image.php is called from html image requests
header('Content-Type: image/jpeg');
readfile($randPic);
?>

а затем я помещаю этот код на html-страницу в свою папку public_html:

<img src="/image.php">

Теперь, когда я загружаю эту html-страницу с этим тегом img, я ничего не получаю. Ни ошибки, ни изображения, ничего, кроме пробелов. Я ценю любое понимание, которое может предоставить любой.


person Bogarto    schedule 19.07.2013    source источник
comment
шаги по отладке: убедитесь, что glob() действительно находит ничего (например, var_dump($files)). Убедитесь, что random_pic() на самом деле возвращает путь (например, var_dump($randPic)), а затем убедитесь, что readfile не возвращает логическое значение false (которое вы на самом деле не можете использовать var_dump, потому что браузер попытается прочитать текст дампа как данные изображения).   -  person Marc B    schedule 20.07.2013
comment
сделать file_exists($randPic); и эхо $randPic... посмотрим, имеет ли это смысл.   -  person Orangepill    schedule 20.07.2013
comment
В дополнение к тому, что сказал Марк, я бы также подумал о добавлении флага отсутствия кеша в заголовок, чтобы они не получали одно и то же изображение каждый раз. В качестве альтернативы, вместо использования readfile вы можете использовать 302 Temporary Redirect и указывать непосредственно на файл изображения.   -  person Mr. Llama    schedule 20.07.2013


Ответы (2)


Почему бы не использовать абсолютный путь вместо:

header('Content-Type: image/jpeg');
readfile('home/folder/my image.jpg');

вот так:

// notice the absolute path prefix
if(!is_file($image_path = '/home/folder/my image.jpg')){
    header('Content-Type: text/plain', 404);
    echo 'Image file not found!';
}

// We got a file, keep going...
header('Content-Type: image/jpeg');
header('Content-Length: '.filesize($image_path));
readfile($image_path);

die; // done here

Или используйте путь относительно текущего каталога скрипта .php с __DIR__.'/path/to/image.jpg'.

person CodeAngry    schedule 19.07.2013
comment
Я просто хочу убедиться, что понимаю. Итак, что касается извлечения случайного изображения, вместо использования этого кода: header('Content-Type: image/jpeg'); прочитать файл ($ randPic); Я должен использовать что-то еще? Похоже, вы ссылались на мой выходной код из моего рабочего решения, а не из моего нерабочего решения для случайных изображений. Мои извинения, если я неправильно понял. - person Bogarto; 20.07.2013
comment
@Bogarto Ваш код, по-видимому, хорош. Вам нужно var_dump($files) внутри функции random_pic и убедиться, что вы видите все, что указано в результате glob. Вот почему я подумал, что относительный путь может быть проблемой... - person CodeAngry; 20.07.2013

Вы должны поставить safe_mode = off или настроить open_basedir, чтобы получить доступ к каталогу изображений.

person Zeque    schedule 24.07.2013