node.js - uint8array to string



8 바이트를 전송할 때까지 Chrome에 파일 다운로드가 표시되지 않음(Firefox에서) (1)

나는 파일을 사용자에게 보내는 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');
});

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

이 문제를 해결할 방법이 있습니까?

위의 코드가있는 URL의 예 :


너비가 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');
});




download