2009-11-27 2 views
30

Я хотел бы создать ответ HTTP, используя multipart/mixed, но я не уверен, какие браузеры его поддерживают; и если это так удобно, как кажется, с точки зрения клиента. Если честно, мне не нужен конкретный тип контента. Я просто хочу передать несколько файлов в одном ответе; возможно, есть еще один тип контента.Поддержка множественных ответов браузером

+0

я не могу найти хорошую информацию о Google, так что вы должны проверить это - Построить простую страницу, которая передается в виде составного - Тест в различных браузерах - приводит сообщение здесь :) (На этой странице это второй результат в Google при поиске) –

+0

Если файлы связаны друг с другом, например с ресурсами корневого документа, попробуйте 'multipart/related'. –

ответ

26

Я протестировал его с помощью самодельного сервера и простого ответа. Не уверен, что ответ хорошо сформирован, потому что ни один браузер не понимает его на 100%. Но вот результаты:

  • Firefox 3.5: Оказывает только последняя часть, остальные игнорируются.
  • IE 8: Показывает весь контент, как если бы он был текстовым/равным, включая границы.
  • Хром 3: сохраняет все содержимое в одном файле, ничего не отображается.
  • Safari 4: сохраняет все содержимое в одном файле, ничего не отображается.
  • Opera 10.10: Что-то странное. Начинает рендеринг первой части как plain/text, а затем очищает все. Индикатор выполнения загрузки висит на 31%.

Вот полный ответ, если кто-то находит какую-либо ошибку, пожалуйста, сообщите мне, и я попробую еще раз:

HTTP/1.1 200 OK 
Date: Tue, 01 Dec 2009 23:27:30 GMT 
Vary: Accept-Encoding,User-Agent 
Content-Length: 681 
Content-Type: Multipart/mixed; boundary="sample_boundary"; 

Multipart not supported :(
--sample_boundary 
Content-Type: text/css; charset=utf-8 
Content-Location: http://localhost:2080/file.css 

body 
{ 
background-color: yellow; 
} 
--sample_boundary 
Content-Type: application/x-javascript; charset=utf-8 
Content-Location: http://localhost:2080/file.js 

alert("Hello from a javascript!!!"); 

--sample_boundary 
Content-Type: text/html; charset=utf-8 
Content-Base: http://localhost:2080/ 

<html> 
<head> 
    <link rel="stylesheet" href="http://localhost:2080/file.css"> 
</head> 
<body> 
Hello from a html 
    <script type="text/javascript" src="http://localhost:2080/file.js"></script> 
</body> 
</html> 
--sample_boundary-- 
+0

Я не уверен, где вы поступили не так, но я реализовал его в firefox в 2006 году, и он работал хорошо. – kybernetikos

+2

Если у вас есть пример, пожалуйста, отправьте его :) Спасибо! –

+0

для узла: ff работает красиво, хром кажется одним кадром позади: '' 'var border =" XXMIMEBOUNDARY "; var section = 0; function writeSection (res) {var a = (раздел ++); console.log ("писать", а); res.write ("Content-type: text/plain \ n \ n"); res.write ("Раздел" + a); res.write ("-" + border + "\ n");}; require («http»). createServer (функция (req, res) {console.log («полученный запрос»); res.writeHead (200, {«Content-type»: «multipart/x-mixed-replace; border = "'+ border +'" '}); writeSection (res); setInterval (function() {writeSection (res);}, 2500);}). listen (8080); '' ' – kybernetikos

4

В моем опыте, многокомпонентные ответы работают в Firefox, но не в Internet Explorer. Это было 2 года назад, используя браузеры того времени.

У меня было многопользовательские ответы HTTP, работающие на поток изображений JPEG. Например, IP-камеры Axis используют для потока движения JPEG для Firefox. Для Internet Explorer, Axis требует использования плагина.

Если поддержка только Firefox соответствует вашим требованиям, я рекомендую установить заголовок длины содержимого в каждой части многочастного ответа. Это может помочь сделать пограничную строку идентичной в исходном HTTP-заголовке и многочастном ответе (в заголовке HTTP отсутствует '-').

3

Две идеи:

  1. Форматирование: Я думаю, что «многочастному» должна быть в нижнем регистре, и я не думаю, что точка с запятой, как ожидается, в конце заголовка Content-типа (хотя это сомнительно, что это будет иметь значение, возможно, что оно может).
  2. Вы пробовали заменить режим? Просто используйте: Content-type: multipart/x-mixed-replace - все остальное должно оставаться неизменным.
+0

Существует большая смысловая разница между 'multipart/mixed' и' multipart/x-mixed-replace'. Маловероятно, что любой браузер будет поддерживать 'multipart/mixed', поскольку он просто не используется реальными серверами. 'multipart/x-mixed-replacement' имеет некоторую поддержку, потому что некоторые серверы используют его для отклика на стороне сервера, например, для потоковой передачи. Единственными другими типами «multipart/...», которые обычно используются с HTTP, являются «multipart/form-data» и «multipart/byteranges». –

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