Chrome не показывает файл как загружаемый до отправки 8 байтов (Firefox делает)
Я хочу иметь метод 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-адресов с приведенным выше кодом:
Ответы
Ответ 1
Вы можете попробовать добавить файл с символами пробела шириной 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');
});