前端请求
let apiId = eventContent.id || eventContent.apiId
//若路径参数或者查询参数不存在或者为空就赋值为undefind
apiPathParams = apiPathParams&&apiPathParams.length>0?JSON.stringify(apiPathParams):'undefind'
apiQueryParams = apiQueryParams&&apiQueryParams.length>0?JSON.stringify(apiQueryParams):'undefind'
let url = `api/file/download/${
apiId}/${
apiPathParams}/${
apiQueryParams}`//拼接接口id、路径参数、查询参数
let link = document.createElement('a')//创建a标签用来下载文件
link.href = url
link.download = '' //下载的文件名
document.body.appendChild(link)
link.click()
URL.revokeObjectURL(link.href) // 释放URL 对象
document.body.removeChild(link)
node端
/**
* 下载文件
*/
router.get('/file/download/:apiId/:apiPathParams/:apiQueryParams', function(req, res) {
try {
let url = config.application.dv_mgt_service_url + `/dataResources/${
req.params.apiId}`;
let apiUrl = ''
axios.get(url, {
headers: headers},{
timeout: projectConfig.timeout}).then(async detail => {
detail.data.response = await getDmsDetailInfo(detail.data.response);
apiUrl = detail.data.response.apiUrl//根据接口id获取完整接口
if(req.params.apiPathParams !== 'undefind'){
//若路径参数存在,拼接路径参数
req.params.apiPathParams = JSON.parse(req.params.apiPathParams)
req.params.apiPathParams.length>0&&req.params.pathParams.forEach(item=>{
//路径参数
apiUrl = apiUrl.replace(`{
${
item.name}}`,item.value)
})
}
if(req.params.apiQueryParams !== 'undefind'){
//若查询参数存在,拼接查询参数
req.params.apiQueryParams = JSON.parse(req.params.apiQueryParams)
let apiSuffix="?";
for(let param of req.params.apiQueryParams){
//拼接api地址--查询参数
apiSuffix += `${
param.name}=${
param.value}&`
}
apiUrl = apiUrl+apiSuffix
apiUrl = apiUrl.slice(0,apiUrl.length-1)
}
var option = {
url: encodeURI(formatRequestUrl(apiUrl))
};
var httpStream = request(option);
var responseData = [];//存储文件流
if (httpStream) {
//判断状态
var ContentDisposition = "";
httpStream.on("response",function(response){
var resHeaders = response.headers;
ContentDisposition = resHeaders["content-disposition"] || "";
});
httpStream.on('data', function (chunk) {
responseData.push(chunk);
});
httpStream.on('end', function () {
var finalData = Buffer.concat(responseData);
res.setHeader("Content-Type",'application/octet-stream');
res.setHeader("Content-Disposition",ContentDisposition);
res.write(finalData);
res.end();
});
}
}).catch(e => {
logger.error(e);
if (!e.response || e.response.status === 404) {
res.status(500).send(language.error_500);
} else {
res.status(e.response.status).send(e.response.data);
}
});
} catch (e) {
logger.error(e);
res.status(500).send(language.error_500);
}
});