将文件从受保护的path下载到浏览器

我有一个反应前端和一个nodejs / express后端。 后端可以通过受保护的路线提供文件(下载):

GET /api/file/:id 

当前端想要启动一个文件下载时,它使用这个代码向这个端点发送一个请求(并且Authorization头被设置了一个有效的token ):

 axios.get(`${apiURL}/file/${id}`) .then(file => { ... }) 

后端回应这个代码:

 router.get('/file/:id', requireAuth, = (req, res, next) => { ... res.set('Content-Type', 'application/pdf'); res.download(file.path, file.filename); };); 

这工作正常:下载开始,二进制数据存在于axios调用的axios .then()情况的file对象中。

我的问题:

而不是下载完整的文件,我想在文件下载开始之前将文件传递给浏览器,这样浏览器就像通常的浏览器触发下载一样处理下载,浏览器会提示下载或显示文件。 如何才能做到这一点…?


解决scheme:

感谢@FakeRainBrigand提示,我通过请求参数向路由添加了基于令牌的授权(使用护照策略):

 const jwtOptions = { jwtFromRequest: ExtractJwt.fromExtractors([ ExtractJwt.fromHeader('authorization'), ExtractJwt.fromUrlQueryParameter('token'), ]), secretOrKey: secretKey, }; 

现在我可以将下载直接传递给浏览器来处理它:

 window.location.href = `${apiURL}/file/${_id}?token=${token}`; 

授权标题将在这里引起问题。 您应该使用cookie,至less对于这个function。 否则,您将不得不在URL中包含一个标记。

这两个解决scheme是window.open响应一个事件,或导航到该url(例如location.href = '...' )。

至less在某些浏览器中,即使您更改了位置,在文件下载时也不会实际导航。