11

I would like to start a simple file download through the browser, however an access token must be passed with a custom HTTP header:

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

How can I inject the Authorization: header following the site URL? I know it's possible to do that using query string, but I want to do it using headers.

I'm familiar with XMLHttpRequest, but as far as I understand it does not trigger download, it only reads content and the file I want to download is few hundred MBs at least.

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

This looks like a simple task, but I'm inexperienced coder so any help would be nice. Thanks.

Thomash
  • 6,173
  • 1
  • 26
  • 49
user2370553
  • 113
  • 1
  • 5
  • Why not do it on the serverside, where you'd normally set the headers ? – adeneo May 16 '13 at 16:27
  • Because file I want to download is not on my server. My server only generates token. Also, I do not want to use any PHP relaying since this would cost me a lot of traffic. – user2370553 May 16 '13 at 17:21

3 Answers3

7

I think this solves your problem:

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);

Modified answer https://stackoverflow.com/a/10518190/2767026 to fit your needs.

Community
  • 1
  • 1
William Weckl
  • 2,297
  • 4
  • 22
  • 42
0

https://stackoverflow.com/a/12372670/1961561 could be a solution for your problem.

$.ajax({
  url: "/test",
  headers: {"X-Test-Header": "test-value"}
});
Community
  • 1
  • 1
carlptr
  • 41
  • 6
0

It is not possible to add custom http header when you download a file by clicking on a link.

However, in your use case, you might store the token in a cookie, which will be automatically added to all browser requests.

Olivier Lecrivain
  • 4,226
  • 2
  • 14
  • 10