Вернуть содержимое изображения в php-файл?

Я действительно не знаю никакого PHP, но я бы хотел сделать одну простую вещь:
Я обращаюсь к php-странице из <img src="/myhumbleimage.php" /> и мне бы хотелось, чтобы изображение было возвращено с другого URL-адреса.


Я придумал:

 <?php header('Content-Type: image/png'); readfile('i' . rand(1,3) . '.png'); exit; 

И это работает:
Выбор аватара http://img.ruphp.com/image/migrate
(Перезагрузите страницу несколько раз!)

Проверьте readfile () .

Основная идея заключается в том, что вы отправляете соответствующие заголовки типа MIME (используя header ()), затем доставляете содержимое файла с помощью readfile() .

Например

 <?php // myhumbleimage.php // Do whatever myhumbleimage.php does before the image is delivered header('Content-Type: image/jpeg'); readfile('path/or/url/of/image/file.jpg'); exit; 

Почему бы просто не сразу ссылаться на изображение? Если вы пытаетесь скрыть факт, что вы тянете изображение из внешнего источника, этот внешний источник все равно сможет сказать, что вы потянете их изображения.

В противном случае передайте заголовок Content-Type с соответствующим типом mime и повторите результаты file_get_contents($imageUrl) .

Просто сгенерируйте или прочитайте, затем выведите изображение с помощью PHP.

 ...get image data from file or dynamically... header('Content-type: image/png'); //or whatever MIME type print $imgdata; 

Или проверьте это: http://php.net/manual/en/function.imagepng.php

Я обнаружил проблемы, если бы я также не включил заголовок Content-Length:. Проблемы связаны с кэшированием, прокси и кешированием. В худшем случае браузер ждет дольше времени для получения дополнительных данных.

Он находится в спецификации и решает все проблемы, поэтому я всегда включал его, даже если современные браузеры могут работать без него. Кто знает, все еще может быть небольшая задержка, так как браузер не знает, когда он получил последний сегмент.

Другая проблема, которую я вижу здесь, заключается в том, что вы принимаете формат изображения .png. Лучше создать определенную функцию для этой цели, чтобы вы могли ее повторно использовать.

 function returnImage( $path ) { header( 'Content-Type: image/' . substr($path, -3) ); header( 'Content-Length: ' . filesize( $path ) ); readfile( $path ); exit; } 

Здесь я сделал много предположений (например, файл существует, а его расширение составляет 3 символа), но эта последовательность кажется серебряной пулей в моем опыте.