Вернуть содержимое изображения в php файл? - PullRequest
7 голосов
/ 21 декабря 2010

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


Я придумал:

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

И это работает:
Выбор аватара http://vercas.webuda.com/img.php?.png
(Перезагрузите страницу несколько раз!)

Ответы [ 4 ]

16 голосов
/ 21 декабря 2010

Извлечение 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;
1 голос
/ 21 декабря 2010

Просто сгенерируйте или прочитайте, а затем выведите изображение с помощью 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

1 голос
/ 21 декабря 2010

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

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

0 голосов
/ 11 августа 2013

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

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

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

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

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

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