2015-11-04 2 views
2

Все примеры, которые я видел, которые реализуют отправленные сервером события (https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events), задают тип контента ответа на text/event-stream.с использованием SSE для отправки данных изображения

Я надеялся отправить данные изображения с помощью механизма SSE. Но я не уверен, будет ли это работать с типом текстового контента.

Могу ли я использовать SSE для этого? Или мне нужно «полномасштабное» соединение для этого?

ответ

1

Вы можете, путем кодирования изображения base64 (SSE не поддерживает отправку двоичных файлов). Но (глядя на ваш комментарий к другому ответу, что это большие изображения), не делайте этого. Если предположить, что нынешнее поколение изображение таймаут, потому что это медленно, чтобы генерировать, не огромный, вот как я бы это сделать:

  1. Вызов/make_my_image/
  2. Это процесс SSE, который начинает делать изображение , Он отправляет обычный заголовок.
  3. Когда изображение будет готово, сохраните его на локальный диск (или в базе данных в памяти и т. Д.)
  4. Используйте SSE для отправки URL-адреса, где можно загрузить изображение. Затем закройте процесс SSE (на стороне сервера).
  5. Клиент запрашивает изображение через Apache (или что-то еще).
  6. Клиент может отправить сообщение, чтобы сообщить, когда он получил изображение, и его можно удалить. И/или используйте задание cron, чтобы очистить старые изображения после стольких часов.

I.e. это приводит к тому, что SSE лучше подходит для текстовых сообщений с малой задержкой: как только изображение будет сделано, клиент может его загрузить. Гораздо лучше, чем фоновый процесс создания изображения, а затем клиент должен опросить, чтобы узнать, когда он будет готов.

Если конфиденциальность важна - никто другой не должен иметь возможность загружать изображение - тогда шаг 5 может быть скриптом PHP (или языком по вашему выбору), который проверяет cookie клиента в соответствии с вашим сеансом и только передает файл если это так.

0

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

В качестве альтернативы, вы можете нарисовать изображение и использовать простые HTTP-запросы. Существует множество подходов и библиотек, один из которых будет использовать Листовку. Вот достойное объяснение: http://omarriott.com/aux/leaflet-js-non-geographical-imagery/

Все, что вам нужно сделать, это разделить огромное изображение на плитки, а затем вы можете даже поставить его на статический сервер. Плитки должны следовать Конвенции [zoom_level]/map_[0..NX]_[0..NY].png

Затем вы устанавливаете координаты системы отсчета (CRS) для L.CRS.Simple и сделать слой работу плитки с сервером изображения:

L.tileLayer('/image1234/tiles/{z}/map_{x}_{y}.png').addTo(map);

Серверные посланными события действительно должны быть использованы как незапрошенный механизм уведомления, если что-то важно на сервере, и браузерный клиент должен знать об этом. Например. другой ответ был отправлен на вопрос SO, пока вы редактируете. Фактические данные всегда извлекаются с помощью дополнительного запроса.

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

Быстрое, надежное и относительно недорогое решение для решения вашей проблемы (показывая огромное изображение) было бы черепицей изображения.

Смежные вопросы