Я использую PHP для генерации изображений, и это отлично работает. Однако у меня возникают проблемы с отображением этих изображений:
Мой генератор изображений – это PHP-файл, который принимает тонны параметров и загружает данные для генерации изображения. Из-за чрезмерных сумм, которые должны быть переданы генератору, использование контейнера GET не работает для меня, поэтому данные отправляются через запрос POST. Результатом этого запроса являются данные необработанного изображения.
я использую
$result = post_request('http://myurl.com/graphx/generator.php', $data); if($result['status'] == 'ok') { echo "<img src=\"data:image/png;base64,". base64_encode($result['content'])."\"/>\n"; }
для отображения моего изображения. Это работает для очень маленьких изображений, но по мере их увеличения (например, 300px * 300px) изображение больше не отображается (похоже, оно где-то вырезано).
Является ли мой подход разумным?
Есть ли способ обхода проблемы размера?
Обновить:
Когда я позволяю генератору сохранять изображение в файл, созданный файл содержит изображение, как я хочу. Кроме того, если преобразовать мой генератор в GET-генератор, следующий код также работает правильно:
$data = http_build_query($data); echo "<img src=\"http://myurl.com/graphx/get_generator.php?{$data}\"/>\n";
Таким образом, это определенно кажется проблемой либо с запросом POST, либо с преобразованием в формат base64
. Я использую запрос POST, как показано здесь .
Я предлагаю структурировать вашу страницу следующим образом:
Главная страница:
<img src="imageproxy.php" />
imageproxy.php:
<?php $result = post_request('http://myurl.com/graphx/generator.php', $data); header('Content-type: image/png'); if($result['status'] == 'ok') { echo $result['content']); } else { readfile('error_message_image.png'); }
вместо того, чтобы пытаться работать с ограничениями на уровень данных и длины, просто попросите свой прокси-скрипт выводить фактические данные необработанного изображения и рассматривать его как изображение в клиентском html-файле.
Согласно http://en.wikipedia.org/wiki/Data_URI_scheme IE 8 (и, предположительно, ниже, если они его поддерживают), «ограничивает URI данных максимальной длиной 32 КБ». Это может быть то, что вы видите, если оно только читает первые 32k того, что вы его отправляете.
Почему вы не используете base64 параметров и не помещаете THAT в запрос GET и не делаете простого:
<img src="/path/to/php.php?p=eyJ0aGlzIjoiaXMiLCJhIjoiYmVhdXRpZnVsIiwic2V0Ijoib2YiLCJwYXJhbWV0ZXJzIjoiISEifQ==" />
Затем на php.php base64_decode ($ p) и верните изображение.
Еще лучше на php.php, используйте X-Sendfile mod of apache ( https://tn123.org/mod_xsendfile/ ) и, возможно, кешируйте изображение так же локально, чтобы вам не приходилось постоянно его воссоздавать
Редактировать:
Я точно не знаю, сколько параметров мы здесь говорим. Если вы заходите и видите, какова максимальная длина URL-адреса в разных браузерах? вы увидите, что опыт показал, что URI составляет около 2000 символов.
Это зависит от того, что ваша закодированная строка base64 меньше, чем вы в безопасности. В противном случае вы могли бы подумать об альтернативных способах кодирования. Возможно, yEnc или base85?
Более того, вы можете хранить сериализованный объект (содержащий необходимые параметры) в локальном хранилище (т. Е. RDBMS), связывать его с id и передавать этот идентификатор. Когда php.php получает идентификатор, он просматривает его в хранилище, извлекает параметры, создавая изображение и так далее.