Встроенные изображения превышают длину - PullRequest
3 голосов
/ 11 января 2012

Я использую 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, как показано здесь .

Ответы [ 3 ]

3 голосов
/ 11 января 2012

Я бы предложил, чтобы ваша страница была структурирована так:

главная страница:

<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 на стороне клиента.

1 голос
/ 11 января 2012

Согласно http://en.wikipedia.org/wiki/Data_URI_scheme IE 8 (и предположительно ниже, если они его поддерживают) «ограничивает URI данных максимальной длиной 32 КБ».Это может быть то, что вы видите, если он читает только первые 32 КБ того, что вы отправляете.

1 голос
/ 11 января 2012

Почему бы вам не выполнить base64 параметры и не поместить THAT в запрос GET, а выполнить простое:

<img src="/path/to/php.php?p=eyJ0aGlzIjoiaXMiLCJhIjoiYmVhdXRpZnVsIiwic2V0Ijoib2YiLCJwYXJhbWV0ZXJzIjoiISEifQ==" />

Затем на php.php base64_decode ($ p) и вернуть изображение.

Еще лучше на php.php, используйте мод apache X-Sendfile (https://tn123.org/mod_xsendfile/)) и, возможно, кешируйте изображение также локально, чтобы вам не приходилось постоянно его воссоздавать

Редактировать:

Я не знаю точно, сколько параметров мы говорим здесь. Если вы посмотрите и увидите Какая максимальная длина URL в разных браузерах? вы увидите, что опыт показал, что URI в значительной степени составляет около 2000 символов.

Так что это зависит от того, меньше ли ваша кодированная строка base64, чем вы в безопасности. В противном случае вы можете подумать об альтернативных способах кодирования. Возможно,yEnc или base85?

Более того, вы можете хранить сериализованный объект (содержащий необходимые параметры) в локальном хранилище (т. е. СУБД), связать его с идентификатором и передать этот идентификатор.идентификатор, ищет его в хранилище, извлекает параметры, создает изображение и т. д.

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