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

StackOverflow https://stackoverflow.com/questions/172192

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

СЕССИЯ может быть вариантом, но это лучший вариант, когда вам нужно регенерировать изображение на нескольких страницах с небольшими изменениями, чтобы вам не приходилось каждый раз запрашивать БД.

Другие советы

Нелегко - в HTML нет встроенной поддержки отправки нескольких запросов POST и рендеринга результатов в виде встроенных ресурсов, как это происходит с < img / > < script / > и другие теги, которые определяют атрибут SRC.

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

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

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

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

  
    

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

  

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

Примерно так

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

<? //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;
    }
?>

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top