a标签结合node端下载文件

前端请求

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

猜你喜欢

转载自blog.csdn.net/yxgd_1442962728/article/details/114679505