Как загрузить / передать файл с сервера express + mongoDB, используя менеджер загрузки браузера - PullRequest
0 голосов
/ 09 ноября 2019

Так что мой заголовок, вероятно, не имеет особого смысла, поэтому позвольте мне объяснить, я использую экспресс с mongoose / MongoDB для загрузки / выгрузки файлов, прежде чем я смог просто перейти к URL-адресу браузера и обработать запрос на получение файла, подобный этому. , но я хотел добавить аутентификацию, и, поскольку мне нужно отправить токен JWT через заголовок, я не могу просто перейти по URL через браузер, позвольте мне показать вам, что у меня есть.

router.get('/file-service/download', auth, async (req, res) => {
  if (!req.user) {
    return res.status(401).send('Please authenticate');
  }

  try {
    const tempID = '5dc5f57a081263451cee80d4';

    const gfs = Grid(conn.db);

    gfs.findOne({ _id: tempID }, (err, file) => {
      //console.log("file", file);

      if (err) {
        return res.status(500).send(err);
      }

      res.set('Content-Type', file.contentType);
      res.set('Content-Disposition', 'attachment; filename="' + file.filename + '"');

      const readStream = gfs.createReadStream({
        _id: tempID
      });

      //console.log("grid", readStream);

      readStream.pipe(res);
    });
  } catch (e) {
    console.log(e);
    res.status(500).send(e);
  }
});

Так что я использую для перехода на localhost: 3000 / file-service / download, и он просто запускает загрузку в chrome, с собственным менеджером загрузок, и показывает прогресс, все, что вы ожидаетепри загрузке файла, но теперь это невозможно, поэтому вместо этого я выполняю запрос axios, как показано ниже.

const config = {
  responseType: 'arraybuffer',
  headers: { Authorization: 'Bearer ' + 'jwtsecret' }
};

console.log('fetching download');

axios
  .get('http://' + currentURL + '/file-service/download', config)
  .then(response => {
    let blob = new Blob([response.data], { type: 'binary/octet-stream' });
    let link = document.createElement('a');
    link.href = window.URL.createObjectURL(blob);
    link.download = 'zip_test.zip';
    link.click();
  })
  .catch(err => {
    console.log(err);
  });

И это работает, НО, он должен сначала загрузить весь файл в память, например, я проверял это с файлом 500 МБ, после того, как я выполняю запрос axios, он принимает как15+ секунд, чтобы он извлек все данные, затем он предлагает использовать их для загрузки и почти мгновенно завершает работу. Но если я удалю аутентификацию и сделаю это только через браузер через URL, загрузка начнется мгновенно и покажет прогресс загрузки хрома, как обычно. Есть ли способ достичь такой же функциональности загрузки / потоковой передачи с axios? Или есть какой-нибудь способ отправить токен без axios, чтобы я мог вообще его избежать и просто сделать это обычным способом?

1 Ответ

0 голосов
/ 10 ноября 2019

Вы можете передать токен как запрос вместо промежуточного программного обеспечения, например, http://localhost:3000/file-service/download?token=kjhdsjkf.sakhdh.asdkd и проверить токен непосредственно перед тем, как пользователь продолжит загрузку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...