Изтегляне на произволни изображения от папка над папката 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 не връща булево невярно (което всъщност не можете да var_dump, защото браузърът ще се опита да прочете дъмп текста като данни за изображение).   -  person Marc B    schedule 20.07.2013
comment
направете file_exists($randPic); и echo $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'); readfile($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