使用JavaScript添加自定义HTTP头并触发文件下载。

14

我想通过浏览器开始一个简单的文件下载,但是必须使用自定义的HTTP头传递访问令牌:

GET https://my.site.com/some/file
Authorization: access_token

如何在网站URL后注入Authorization:标头? 我知道可以使用查询字符串来实现,但我想使用标头来实现。

我熟悉XMLHttpRequest,但据我所知它不会触发下载,它只读取内容,而我要下载的文件至少有几百MB。

xhr.setRequestHeader('Authorization', 'access_token');

这看起来是一个简单的任务,但我是一名经验不足的编码人员,所以任何帮助都会很好。谢谢。


为什么不在服务器端处理,通常您会在那里设置标头? - adeneo
因为我想要下载的文件不在我的服务器上。我的服务器只生成令牌。 此外,我不想使用任何PHP中继,因为这会给我带来很多流量成本。 - user2370553
3个回答

8
我认为这可以解决你的问题:
function toBinaryString(data) {
    var ret = [];
    var len = data.length;
    var byte;
    for (var i = 0; i < len; i++) { 
        byte=( data.charCodeAt(i) & 0xFF )>>> 0;
        ret.push( String.fromCharCode(byte) );
    }

    return ret.join('');
}


var xhr = new XMLHttpRequest;

xhr.open( "GET", "https://my.site.com/some/file" );     

xhr.addEventListener( "load", function(){
    var data = toBinaryString(this.responseText);
    data = "data:application/text;base64,"+btoa(data);
    document.location = data;
}, false);

xhr.setRequestHeader("Authorization", "access_token" );
xhr.overrideMimeType( "application/octet-stream; charset=x-user-defined;" );
xhr.send(null);

为了满足您的需求,修改https://dev59.com/tWkv5IYBdhLWcg3wjxdl#10518190中的答案。


能否为下载设置自定义文件名? - Oleksii Kyslytsyn
@Oleksii 我不知道,很久以前回答的时候这段代码满足了我的需求... :( 很抱歉。 - William Weckl
1
实际上是这样的:link.attr({ "href": data, "download": name + new Date().valueOf() + ext }) - Oleksii Kyslytsyn

0

当您通过单击链接下载文件时,无法添加自定义HTTP标头。

但是,在您的用例中,您可以将令牌存储在Cookie中,这将自动添加到所有浏览器请求中。


-1

谢谢,这看起来就是我想要的,但我不使用jQuery。有没有用“纯JavaScript”完成这个的方法? - user2370553
不,它仍然没有触发下载。 - user2370553
由于安全原因,您不能使用ajax下载并保存文件到磁盘。 - LordDawnhunter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接