是否有类似XHR的浏览器API可用于通过HTTP将二进制文件流式传输到服务器?
我希望随着时间的推移制作HTTP PUT请求并以编程方式创建数据.我不想一次创建所有这些数据,因为它可能会在内存中出现.一些psueudo代码来说明我所得到的:
var dataGenerator = new DataGenerator(); // Generates 8KB UInt8Array every second
var streamToWriteTo;
http.put('/example', function (requestStream) {
streamToWriteTo = requestStream;
});
dataGenerator.on('data', function (chunk) {
if (!streamToWriteTo) {
return;
}
streamToWriteTo.write(chunk);
});
Run Code Online (Sandbox Code Playgroud)
我现在有一个Web套接字解决方案,但更喜欢常规HTTP,以便更好地与一些现有的服务器端代码互操作.
编辑:我可以使用最前沿的浏览器API.我正在查看Fetch API,因为它支持请求体的ArrayBuffers,DataViews,Files等.如果我能以某种方式伪造其中一个对象,以便我可以使用动态数据的Fetch API,这对我有用.我尝试创建一个Proxy对象,看看是否有任何方法被调用,我可以修补.不幸的是,似乎浏览器(至少在Chrome中)正在使用本机代码而不是JS版本进行读取.但是,如果我错了,请纠正我.
根据caniuse,在Microsoft Edge build 10547+中支持元素的download属性,但不支持IE或Safari.<a>
如何在不使用<a>带download属性集的元素或服务器的情况下下载文件对象?
特定
var data = new Array(1000000);
for (var i = 0; i < data.length; i++) {
data[i] = 1;
}
var blob = new Blob([data]);
Run Code Online (Sandbox Code Playgroud)
哪个是存储的数组的二进制数据表示?
我有一个 Node.js 端点,当使用以下命令访问时,它会正确触发任意大的文件下载:
response.setHeader('Content-disposition', 'attachment; filename=' + fileName);
response.set('Content-Type', 'text/csv');
response.status(200);
result.pipe(response);
Run Code Online (Sandbox Code Playgroud)
其中result是变换流,response是Express 对象。
当直接访问 Chrome、Firefox、Internet Explorer 等中的端点时,此方法工作正常。问题是在启用基于令牌的身份验证时尝试访问端点而产生的。
从用户的角度来看,当他们单击按钮时,就会下载文件。
如何使按钮使用请求标头中的正确身份验证令牌命中此端点并导致下载文件?
当用户单击该按钮时,它会触发由 redux-api-middleware 处理的操作,该操作GET向端点发出请求(身份验证令牌自动包含在请求中)。该中间件将响应保存在一个变量中,该变量由 React 组件获取。在此 React 组件中,如果正在使用的浏览器(即 Chrome 和 Opera)支持流,response.body则会存在,因此您可以执行如下操作。
if (response.body) {
const csvReader = response.body.getReader();
const textDecoder = new TextDecoder();
const processCsvRow = (csvRow) => {
if (csvRow.done) {
console.log('Finished downloading file.');
return Promise.resolve();
}
// Write to new file for user to download …Run Code Online (Sandbox Code Playgroud)