在发送8个字节之前,Chrome不会将文件显示为已下载(Firefox可以)

Sha*_*dix 13 google-chrome download node.js

我想要一个将文件发送给用户的http方法,但需要一些时间(例如4秒)来生成文件内容.

我想要的是,浏览器立即显示文件被下载.但Chrome只会在发送8个字节后将文件显示为已下载.我不知道我的文件的前8个字节.但是,Firefox会立即显示下载内容.

这是一个例子(在Express中,但后端技术并不重要,我在ASP.Net中有相同的例子):

const express = require('express');

const app = express();
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))

app.get('/:type?', async (req, res) =>  {
  res.set("Content-type", "application/octet-stream");
  res.set("Content-Disposition", "attachment;filename=\"Report.txt\"");

  res.write('1234567'); 
  if (req.params.type == "instant")
    res.write('8'); //if I send 8 bytes before sleep, file downloading appears instantly
  await sleep(4*1000);

  res.write('9');
  res.end();
});

app.listen(3000, () => {
  console.log('server started');
});
Run Code Online (Sandbox Code Playgroud)

https://repl.it/@ArturDrobinskiy/AllJumboSpellchecker?language=nodejs

有办法解决这个问题吗?

带有以上代码的示例网址:

daz*_*daz 0

您可以尝试在文件前面添加 0 宽度的空格字符。

const express = require('express');

const app = express();
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))

app.get('/:type?', async (req, res) =>  {
  res.set("Content-type", "application/octet-stream");
  res.set("Content-Disposition", "attachment; filename=\"Report.txt\"");
  res.write('\u200B\u200B\u200B\u200B\u200B\u200B\u200B\u200B'); 
  //res.write('1234567'); 
  if (req.params.type == "instant")
    res.write('8'); //if I send 8 bytes before sleep, file downloading appears instantly
  await sleep(4*1000);

  res.write('9');
  res.end();
});

app.listen(3000, () => {
  console.log('server started');
});
Run Code Online (Sandbox Code Playgroud)