浏览器支持多部分响应

时间:2009-11-27 00:11:04

标签: http multipartform-data multipart

我想使用multipart / mixed创建HTTP响应,但我不确定哪些浏览器支持它;从客户的角度来看,如果它听起来很方便。 说实话,我不需要具体的内容类型。我只想在同一个响应中传输多个文件;也许还有更多使用的内容类型。

4 个答案:

答案 0 :(得分:28)

我已经使用自制服务器和简单的响应对其进行了测试。不确定响应是否格式正确,因为没有浏览器100%理解它。但结果如下:

  • Firefox 3.5 :仅渲染最后一部分,其他部分将被忽略。
  • IE 8 :将所有内容显示为text / plain,包括边界。
  • Chrome 3 :将所有内容保存在一个文件中,不会呈现任何内容。
  • Safari 4 :将所有内容保存在一个文件中,不会呈现任何内容。
  • Opera 10.10 :奇怪的东西。开始将第一部分渲染为纯文本/文本,然后清除所有内容。加载进度条挂起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--

答案 1 :(得分:4)

根据我的经验,多部分响应在Firefox中有效,但在Internet Explorer中无效。这是2年前,使用当时的浏览器。

我已经有HTTP多部分响应用于JPEG图像流。例如,Axis IP摄像机用于Firefox的动态JPEG流。对于Internet Explorer,Axis需要使用插件。

如果仅Firefox支持符合您的要求,那么我建议在多部分响应的每个部分中设置内容长度标题。在原始HTTP标头和多部分响应中使边界字符串相同可能会有所帮助(HTTP标头中缺少“ - ”)。

答案 2 :(得分:3)

两个想法:

  1. 格式化:我认为“multipart”应该是小写的,我不认为在Content-type标题的末尾会有分号(尽管它会产生影响,但它有可能是可能)。
  2. 您是否尝试过更换模式?只需使用:Content-type: multipart/x-mixed-replace - 其他一切都应该保持不变。

答案 3 :(得分:0)

自己动手做

(一个不错的选择)

可以手动进行多部分响应!

因此,您可以写一个没有多部分的答案!假设是在分块模式下!在那里有意义!

所以您正在流式传输数据!

将所有内容发送为平淡的文字!

制作自己的分隔符!在每个部分之间!

在浏览器中!提取并解析数据!拆分以分别获取每个部分!
并解析每个appart!取决于保存的数据类型!

因此,如果一部分是json!您是这样解析的!

快速插图!假设我们要发送一个csv文件!或其他类型的文件!除此之外,我们还想发送一个json对象!

通过分块流式传输

以下代码说明了这一点:

const data = {
    initCapital: fileState.mappingObj.initialCapital
};

res.write(JSON.stringify(data, undefined, 0));
res.write('>>>>'); // parts separator
fileState.readStream.pipe(res); // continue streaming the file (chunk by chunk)

在客户端

export function parseBackTestFetchedData(data: string) {
    const [_data, csvData] = data.split('>>>>');
    return {
        data: JSON.parse(_data),
        backTestStatesData: parseCsv(csvData)
    };
}

enter image description here

那样!谁是客户都没关系!