35

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

4

4 回答 4

32

我已经用自制的服务器和简单的响应对其进行了测试。不确定响应是否格式正确,因为没有浏览器可以 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--
于 2009-12-02T00:46:20.290 回答
4

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

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

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

于 2009-12-02T11:31:09.567 回答
3

两个想法:

  1. 格式:我认为“multipart”应该是小写的,并且我不认为分号应该出现在 Content-type 标题的末尾(尽管它是否会有所作为值得怀疑,但它可能会)。
  2. 你试过替换模式吗?只需使用:Content-type: multipart/x-mixed-replace-- 其他一切都应该保持不变。
于 2009-12-22T21:04:54.687 回答
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)
    };
}

在此处输入图像描述

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

于 2020-05-30T03:00:13.770 回答