使用xhr實(shí)現(xiàn)后臺返回 Content-Type: application/octet-stream 流的下載

import?_?from?'lodash';

import?Env?from?'@/utils/environment';

import?moment?from?'moment';

import?{?DATETIME_FORMAT?}?from?'@/utils/format';

import?Token?from?'@/utils/common-data/token';

export?default?(

??data,

??options?=?{

????setFileName:?()?=>?`${moment().format(DATETIME_FORMAT)}.zip`,

????requestConfig:?{

??????headers:?{}

????}

??}

)?=>

??new?Promise((resolve,?reject)?=>?{

????const?token?=?_.get(Token.vuexToken,?'token',?'');

????const?request?=?new?XMLHttpRequest();

????request.open('post',?Env.backendSearchApiBaseUrl?+?'/v1/export',?true);

????request.setRequestHeader('Content-Type',?'application/json');

????request.setRequestHeader('Authorization',?token);

????request.responseType?=?'blob';

????request.timeout?=?options.timeout???options.timeout?:?30000;

????const?{?setFileName,?requestConfig?}?=?options;

????const?{?headers,?...res?}?=?requestConfig;

????Object.keys(headers).forEach(key?=>?{

??????request.setRequestHeader(key,?headers[key]);

????});

????Object.keys(res).forEach(key?=>?{

??????request[key]?=?res[key];

????});

????request.onloadend?=?function()?{

??????if?(request.readyState?==?4)?{

????????if?(request.status?===?200)?{

??????????const?content?=?request.response;

??????????const?blob?=?new?Blob([content]);

??????????const?fileName?=?_.isFunction(setFileName)

??????????????setFileName()

????????????:?_.isString(setFileName)

??????????????setFileName

????????????:?`${moment().format(DATETIME_FORMAT)}.zip`;

??????????if?('download'?in?document.createElement('a'))?{

????????????//?非IE下載

????????????const?elink?=?document.createElement('a');

????????????elink.download?=?fileName;

????????????elink.style.display?=?'none';

????????????elink.href?=?URL.createObjectURL(blob);

????????????document.body.appendChild(elink);

????????????elink.click();

????????????URL.revokeObjectURL(elink.href);?//?釋放URL?對象

????????????document.body.removeChild(elink);

??????????}?else?{

????????????//?IE10+下載

????????????navigator.msSaveBlob(blob,?fileName);

??????????}

??????????resolve({?ok:?true?});

????????}?else?{

??????????reject({?ok:?false,?errorType:?'result_error',?message:?'導(dǎo)出失敗'?});

????????}

??????}

????};

????request.ontimeout?=?function()?{

??????reject({

????????ok:?false,

????????errorType:?'timeout_error',

????????message:?'請求超時'

??????});

????};

????request.onerror?=?function()?{

??????reject({

????????ok:?false,

????????errorType:?'onerror',

????????message:?'導(dǎo)出出錯'

??????});

????};

????request.send(JSON.stringify(data));

??});

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容