Как я могу показать результат запроса POST в виде изображения? - PullRequest
0 голосов
/ 05 октября 2008

Я работаю над веб-приложением, в котором динамически созданные изображения используются для отображения информации. Эти данные в настоящее время отправляются на изображения, используя строку запроса GET, но с более сложными изображениями и данными, я беспокоюсь о том, что у меня могут возникнуть проблемы с ограничением символов в URL.

Я мог бы просто передать идентификатор записи в изображение и запросить эту базу данных, но это, очевидно, увеличило бы спрос на сервере. Есть ли способ добавить изображение, полученное с помощью POST, в документ HTML?

Ответы [ 6 ]

5 голосов
/ 05 октября 2008

В конце концов, я думаю, что запрос к базе данных, вероятно, будет быстрее. Получить небольшую строку (скажем, до 2000 символов) из базы данных очень быстро и, вероятно, быстрее, чем когда пользователь постоянно публикует ее, особенно если на странице более 1.

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

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

1 голос
/ 05 октября 2008

Не легко - HTML не включает встроенную поддержку для отправки нескольких запросов POST и рендеринга результатов в виде встроенных ресурсов, как это происходит с image и другими тегами, которые определяют атрибут SRC.

Даже обходные пути AJAX могут вам здесь не помочь. Изменить атрибут SRC изображения легко, но все, что нужно сделать, это заставить браузер получить новое изображение (из кэша или с сервера, в зависимости от вашей конфигурации). На самом деле изменение содержимого изображения на двоичный ответ от HTTP POST является гораздо более сложным процессом - хотя вы можете посмотреть на base64-кодирование потока ответов и использовать схему data: URL для отображения получающегося изображения в ваша страница.

Вы всегда можете иметь форму с кнопкой «Нажмите для просмотра изображения» в качестве кнопки отправки, конечно - вы отправляете форму, сервер отвечает данными image / jpeg, и ваш браузер отображает ее как отдельное изображение. Я почти уверен, что вы не можете сделать это встроенным.

0 голосов
/ 06 октября 2008

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

поэтому на главной странице есть фрейм. главная страница имеет форму, в которой размещается I-кадр, а сервер возвращает изображение, отображаемое в iframe.

0 голосов
/ 05 октября 2008

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

0 голосов
/ 05 октября 2008

Чтобы расширить комментарий Дэррила Хейна:

При этом я бы порекомендовал удалить его из СЕССИИ после того, как вы закончили с ним. Если он все время там, PHP будет загружать его при каждом вызове страницы, а не только над изображением "page". - Дэррил Хейн

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

как то так

Страница запроса

<? //index.php
    $_SESSION['imagedata']['header'] = array('name'=>'Simon','backgroundcolor'=>'red');
    echo '<img src="image.php?image=header">';
    // more stuff
    echo '<img src="image.php?image=header">'; // same image
?>    

Сценарий изображения

<?  //image.php
    switch($_GET['image']){
        case 'header':
            if(isSet($_SESSION['imagedata']['header'])){
                // create image using $_SESSION['imagedata']['header'] data
                // create cached image
                unset($_SESSION['imagedata']['header']);
            else if(cache_file_exists()){
                // display cached file
            }else{
                // no data, use plan B
            }
        break;
    }
?>
0 голосов
/ 05 октября 2008

Одним из вариантов может быть сохранение этих данных в переменной сеанса. Вы должны сделать несколько тестов, чтобы увидеть, как ваш сервер (ы) справляется с этим лучше

...