getimagesize для динамического изображения

У меня есть таблица MySQL, в которой я храню аватары пользователей в виде большого двоичного объекта. Я извлекаю эти изображения с помощью скрипта avatar.php, который выводит изображение. Чтобы запросить конкретное изображение пользователя, вы должны вызвать avatar.php?id=(идентификатор пользователя). Чтобы сделать имя динамического изображения красивым, я добавил переписанный URL-адрес в свой .htaccess, чтобы вы также могли вызывать avatar-(userid).jpg, что будет переведено в avatar.php?id=(userid).

Теперь я хочу получить изображение пользователя и манипулировать им с помощью GD. Я пытался использовать getimagesize() и imagecreatefromjpeg(), но я постоянно получаю сообщение об ошибке «не удалось открыть поток, нет такого файла или каталога». Оба скрипта, в которых я пытаюсь использовать эти функции, как и скрипт avatar.php, находятся в корневом каталоге. Я попытался:

getimagesize('avatar.php?id=1');
getimagesize('./avatar.php?id=1');
getimagesize('/avatar.php?id=1');
...and the same but using avatar-1.jpg instead.

Когда я использую полный URL-адрес своего сайта (включая http:// и т. д.), он действительно работает... Но я не понял, почему.

//Изменить: аналогичная проблема возникает при использовании функции file_exists(). Если я попробую file_exists('./avatar.php'), он вернет true, если я добавлю get-vars, он вернет false. Эти функции не подходят для динамических файлов?

Может ли кто-нибудь помочь мне, пожалуйста?

заранее спасибо


person carlo    schedule 22.10.2012    source источник


Ответы (3)


  1. Загрузите строку изображения непосредственно из вашей базы данных в переменную... не через getimagesize('avatar.php?id=1');
  2. Используйте imagecreatefromstring, чтобы загрузить изображение как объект изображения. После этого вы можете манипулировать своим изображением и отправлять его на выход.

Если вам просто нужен размер изображения без каких-либо манипуляций, вы можете использовать getimagesizefromstring

person hazelnut    schedule 22.10.2012

getimagesize ожидает путь к файлу. getimagesize('avatar.php?id=1') пытается открыть файл avatar.php?id=1 на локальном жестком диске, которого, конечно же, не существует.
Если вы используете getimagesize('http://example.com/avatar.php?id=1'), подразумевается, что путь является URL-адресом, и он будет проходить через оболочку HTTP. По сути, getimagesize по-прежнему будет думать, что открывает локальный файл, но PHP будет получать этот файл через HTTP-запрос в фоновом режиме. Поскольку этот HTTP-запрос на самом деле возвращает действительный файл изображения, это работает.
Конечно, вы не хотите задействовать свой веб-сервер каждый раз, когда пытаетесь открыть изображение, так как это ненужная трата ресурсов. На самом деле, даже если бы getimagesize('avatar.php?id=1') работало так, как вы думаете, это все равно требует больших накладных расходов для того, что вы пытаетесь сделать.

Если ваши изображения хранятся в базе данных, определяйте размеры изображения один раз, когда вы помещаете изображение в базу данных и сохраняете их в столбце базы данных. Затем просто запросите размер из базы данных.


Аналогичная проблема возникает при использовании функции file_exists(). Если я попробую file_exists('./avatar.php'), он вернет true, если я добавлю get-vars, он вернет false. Эти функции не подходят для динамических файлов?

Все эти функции предполагают пути к файлам. avatar.php — допустимое имя/путь к файлу. avatar.php?foo=bar не является допустимым именем файла/путем. Последний является (частью) URL. URL-адреса не имеют ничего общего с локальной файловой системой. Они обрабатываются только через веб-сервер, который может вызывать или не вызывать PHP или какой-либо другой файл на диске. Вам необходимо различать понятия пути к файлам и URL-адреса.

person deceze♦    schedule 22.10.2012
comment
Я говорил о getimagesize в качестве примера. На самом деле я временно храню большое изображение в базе данных, которое хочу загрузить через imagecreatefromjpeg, чтобы сделать его миниатюру и сохранить в другом столбце базы данных. Другими словами, мне нужно получить изображение из базы данных, обработать его с помощью GD, а затем снова сохранить в базе данных. - person carlo; 22.10.2012
comment
Да, и я надеюсь, что прояснил вашу путаницу в отношении путей к файлам/URL-адресов. imagecreatefromjpeg также ожидает путь к файлу. Если вы получаете образ из базы данных, у вас не будет его на диске в виде файла, и он тоже не будет работать. Тогда вам нужно использовать imagecreatefromstring. - person deceze♦; 22.10.2012

Это не работает, потому что getimagesize пытается открыть php-файл, а не «изображение», которое выводит php-файл при анализе и выполнении.

Это также причина, по которой работает полный URL: ваш скрипт запрашивает выходные данные с вашего веб-сервера, а веб-сервер выполняет скрипт (загружая изображение из БД и выводя его).

Загрузка его через веб-сервер (с полным URL-адресом) может быть самым простым вариантом.

Вы также можете создать ресурс изображения с помощью imagecreatefromstring (ссылка), предоставив функции результаты из БД, а затем манипулировать этим.

person Roman    schedule 22.10.2012