我想创建一个 HTTP 响应,使用 multipart/mixed,但我不确定哪些浏览器支持它;从客户的角度来看,如果它听起来很方便。老实说,我并不特别需要那种内容类型。我只想在同一个响应中传输多个文件;也许还有另一种更常用的内容类型。
4 回答
我已经用自制的服务器和简单的响应对其进行了测试。不确定响应是否格式正确,因为没有浏览器可以 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--
根据我的经验,多部分响应在 Firefox 中有效,但在 Internet Explorer 中无效。这是 2 年前,使用当时的浏览器。
我的 HTTP 多部分响应适用于 JPEG 图像流。例如,Axis IP 摄像机用于 Firefox 的动态 JPEG 流。对于 Internet Explorer,Axis 需要使用插件。
如果仅 Firefox 支持满足您的要求,那么我建议在多部分响应的每个部分中设置 content-length 标头。它可能有助于使原始 HTTP 标头和多部分响应中的边界字符串相同(HTTP 标头中缺少“--”)。
两个想法:
- 格式:我认为“multipart”应该是小写的,并且我不认为分号应该出现在 Content-type 标题的末尾(尽管它是否会有所作为值得怀疑,但它可能会)。
- 你试过替换模式吗?只需使用:
Content-type: multipart/x-mixed-replace
-- 其他一切都应该保持不变。
自己多部分
(一个不错的选择)
可以手动进行多部分响应!
所以可以写一个没有多部分的响应!让我们说在分块模式!有道理!
所以你正在流式传输数据!
全部发送为直言不讳的文本!
制作自己的分隔符!各部分之间!
在浏览器中!提取和解析数据!拆分以分别获取每个部分!
并解析每个 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)
};
}
那样!客户是谁并不重要!