鍍金池/ 問答/HTML/ js中如何使用ajax的get來向后臺獲取文件流進行文件下載(其中header中

js中如何使用ajax的get來向后臺獲取文件流進行文件下載(其中header中傳token參數(shù))

js中如何使用ajax的get來向后臺獲取文件流進行文件另存為的下載

其中header需要傳token和os參數(shù)到后臺進行驗證

請問這個JS應(yīng)該如何寫?希望大神不吝賜教,謝謝~

如下方法后臺無法獲取header參數(shù),360瀏覽器中也沒有啟動另存為的窗口

var url = "{#$apiHost#}/aw/export?brand_ids="+brand_ids;
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = "blob";
xhr.setRequestHeader("token", "5f963175cc75613398e25ce2e5da56d7");
xhr.setRequestHeader("os", "1");
xhr.onload = function() {
    if (this.status == 200) {
        try{
            var elemIF = document.createElement("iframe");
            elemIF.src = this.responseURL;
            elemIF.style.display = "none";
            document.body.appendChild(elemIF);
        }catch(e){
        }
    }
}
xhr.send();
回答
編輯回答
你的瞳

在瀏覽器環(huán)境下,JS不具備對本地文件進行完全可控的讀寫能力。因此,如果可以的話,盡量讓后臺從GET的參數(shù)中獲取token等信息,然后返回文件流。前端只需要使用 a 標(biāo)簽和 download 屬性即可下載。


如果一定要從前端讀取文件流然后下載,可以使用 blob 對象實現(xiàn)。但是兼容性就無法保證了,blob對象只在 IE11 可用。

另外后臺收不到 header 可能是跨域問題導(dǎo)致的,只要是帶自定義header的跨域請求,在發(fā)送真實請求前都會先發(fā)送OPTIONS請求,瀏覽器根據(jù)OPTIONS請求返回的結(jié)果來決定是否繼續(xù)發(fā)送真實的請求進行跨域資源訪問。

function export_raw(name, blob) {
    // name=文件名, blob=文件二進制對象
    var urlObject = window.URL || window.webkitURL || window;
    var save_link = document.createElementNS("http://www.w3.org/1999/xhtml", "a")
    save_link.href = urlObject.createObjectURL(blob);
    save_link.download = name;
    fake_click(save_link);
}

function fake_click(obj) {
    var ev = document.createEvent("MouseEvents");
    ev.initMouseEvent(
        "click", true, false, window, 0, 0, 0, 0, 0
        , false, false, false, false, 0, null
    );
    obj.dispatchEvent(ev);
}
2017年12月9日 03:05
編輯回答
執(zhí)念

改成這樣就好了。

var xhh = new XMLHttpRequest();
                xhh.open("post", Action.FILES_W_DOWNLOADFILE + "/"+ fileName );
                xhh.setRequestHeader("Authorization", this.Axios.defaults.headers.Authorization = JSON.parse(getCookie('userInfo')).tokenType+ ' ' + JSON.parse(getCookie('userInfo')).accessToken);
                xhh.setRequestHeader("Content-Type","application/json");
                xhh.responseType = 'blob';
                xhh.onreadystatechange = function () {
                    if (xhh.readyState === 4 && xhh.status === 200) {
                        var name = xhh.getResponseHeader("ajax-filename");
                        var mimeType = xhh.getResponseHeader("ajax-mimeType");
                        var blob = new Blob([xhh.response], {type: mimeType});
                        var csvUrl = URL.createObjectURL(blob);
                        var link = document.createElement('a');
                        document.body.appendChild(link); //創(chuàng)建的標(biāo)簽添加到body,解決Firefox下無法打開頁面的問題
                        link.href = csvUrl;
                        link.target = '_blank';
                        link.id = 'linkId',
                        link.className = 'linkId',
                        link.download = decodeURI(name);
                        document.getElementById("linkId").click();
                        // link.remove(); //將a標(biāo)簽移除
                        $('.linkId').remove()
                    }
                };
                xhh.send();
2017年3月24日 00:37
編輯回答
替身

經(jīng)過網(wǎng)上查閱資料,成功將header傳到了后臺,
現(xiàn)在的問題是,后臺給我返回了文件流,請問使用JS如何去自動下載這個返回的文件流

var settings = {
  "async": true,
  "crossDomain": true,
  "url": "{#$apiHost#}/aw/export?brand_ids="+brand_ids,
  "method": "GET",
  "headers": {"token": "5f963175cc75613398e25ce2e5da56d7","os": "1"}
}
$.ajax(settings).done(function (data) {
    console.log(data);
});

以上data就是返回的文件流,請問如何正確使用JS來讓返回的文件流自動下載呢?

2017年11月5日 13:42