【问题标题】:Browser support of multipart responses多部分响应的浏览器支持
【发布时间】:2010-12-20 20:16:11
【问题描述】:

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

【问题讨论】:

  • 我在 Google 上找不到任何好的信息,因此您必须对其进行测试 - 构建一个以多部分形式发送的简单页面 - 在各种浏览器中进行测试 - 在此处发布结果 :)(此page 是 Google 搜索时的第二个结果)
  • 如果文件相互关联,比如根文档的资源,试试multipart/related

标签: http multipartform-data multipart


【解决方案1】:

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

  • Firefox 67.0.1(64 位):仅渲染最后一部分,忽略其他部分。
  • IE 11.503:将所有内容保存在一个文件中(包括边界),不呈现任何内容。
  • Chrome 2019 年 5 月:将所有内容保存在一个文件中,不呈现任何内容。
  • 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--

【讨论】:

  • 我不确定你哪里出错了,但我在 2006 年在 Firefox 中实现了它,并且效果很好。
  • 如果您有任何示例,请提交:) 谢谢!
  • for node: ff 效果很好,chrome 似乎落后一帧:var boundary="XXMIMEBOUNDARY"; var section=0; function writeSection(res){var a=(section++); console.log("writing",a); res.write("Content-type: text/plain\n\n"); res.write("Section "+a);res.write("--"+boundary+"\n");}; require('http').createServer(function(req, res){console.log('received request'); res.writeHead(200,{"Content-type":'multipart/x-mixed-replace;boundary="'+boundary+'"'}); writeSection(res); setInterval(function(){writeSection(res);},2500);}).listen(8080);
  • 我刚刚对更新的版本(Chrome、Edge、IE、Firefox)进行了测试,包含 2 个 PNG 文件的多部分响应,没有任何变化(我用测试的浏览器版本更新了答案)
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    两个想法:

    1. 格式:我认为“multipart”应该小写,并且我认为分号不应出现在 Content-type 标头的末尾(尽管它是否会有所作为值得怀疑,但它可能可能)。
    2. 您是否尝试过替换模式?只需使用:Content-type: multipart/x-mixed-replace——其他一切都应该保持不变。

    【讨论】:

    • multipart/mixedmultipart/x-mixed-replace 之间存在很大的语义差异。任何浏览器都不太可能支持multipart/mixed,因为它不是真正的服务器使用的东西。 multipart/x-mixed-replaced 有一些支持,因为有些服务器确实将它用于服务器端推送,例如流媒体。唯一常用于 HTTP 的其他 multipart/... 类型是 multipart/form-datamultipart/byteranges
    【解决方案4】:

     自己多部分

    (一个不错的选择)

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

    所以可以写一个没有多部分的响应!让我们说在分块模式!有道理!

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

    全部发送为直白文本!

    制作自己的分隔符!各部分之间!

    在浏览器中!提取和解析数据!拆分以分别获取每个部分!
    并解析每个 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)
        };
    }
    

    这样!客户是谁并不重要!

    【讨论】:

    • 有趣的答案。就我而言,我希望使用 multipart 来减少请求并缩短浏览器加载时间。如果在 js 中完成,手动解析会增加时间,并且可能没有任何意义来补偿往返。
    • 好吧!我不太了解多部分响应如何工作的细节!以及如何在解析和提取方面做得更好!但在所有情况下,它也会在浏览器级别被解析!它在内部解析和在 js 中解析之间的区别可能不是什么大问题!当然需要进行基准测试!否则我会问为什么不只是一个包含所有(内部解析)的普通答案(内部解析)此外,为了更好地加载,您可以在数据进入时开始读取和处理数据!收听正文流!并在飞行中处理它!增量加载数据!
    • 还按正确的顺序发送有意义的零件!为了那个加载!
    • 也用于解析json数据!它使用相同的内部机制!所以唯一重要的元素就是分离!如果数据很小,则无关紧要!如果大的话!就像一开始的小零件一样!然后是最后一个重要部分!通过流式处理!很好!并且还通过一次解析!和提取!因此,精确计算有多少零件会有所帮助!优化萃取!甚至可以根据请求设置边界位置!第一行保存该元数据!其余的提取将是直接的!可以制作一种工具来制作它以供一般使用!并优化它!
    • 这很难说,但想法是,如果发送一个 css 文件和图像,然后 html,则即使在 html 完成下载之前,图像也可用于渲染,因为浏览器会逐步解析。它也发生在 JS 代码被解析和执行之前
    猜你喜欢
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 2013-09-09
    • 2012-04-10
    • 2019-07-30
    • 2012-02-14
    • 2010-11-24
    相关资源
    最近更新 更多