将文件从受保护的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在某些浏览器中,即使您更改了位置,在文件下载时也不会实际导航。