我正在使用Spring Boot
开发一个RESTful API,并使用oAuth2.0
(通过Spring Security
)和我在AngularJS的前端进行保护。
我需要下载一个文件,我读过的每个帖子都说(我明白)我应该使用window.open('urlToTheFileEndpoint');
但这样做,我无法添加安全标头(就像我所有的其他ajax请求一样),因此API不允许我的请求完成。
有办法解决这个问题吗?或者我应该使此文件端点不安全吗?
答案 0 :(得分:1)
这个SO线程可能很有用:
Download file with a REST request needing headers and giving the content
它还提到了这篇文章:
File Download with HTTP Request Header
这是一个片段:
var id = 123;
var req = ic.ajax.raw({
type: 'GET',
url: '/api/dowloads/'+id,
beforeSend: function (request) {
request.setRequestHeader('token', 'token for '+id);
},
processData: false
});
答案 1 :(得分:1)
所以这就是我解决问题的方法:
当用户点击“下载”时,我会对API服务器进行ajax调用,该服务器不返回文件,但返回临时uuid.route
。服务器将创建一个名为window.open('getFile?uuid=abc-123')
的临时文件(即:abc-123.route),其中包含文件的实际路径(即:/mnt/data/files/excel_template.xlsx)。
然后当ajax调用使用uuid返回时,我可以调用{{1}}。这将是一个不安全的端点。但是一旦下载或在到期时间内,该路由文件将被删除,因此永远不会再被调用。
这样,它支持任何大小的文件。
这是我最好的方法。