Grails4-iView前后端,Excel导出后台生成文件名

 后端:响应的时候给请求头里面加入标记字段"nameSpace=behind"

response.setContentType("application/octet-stream");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setHeader("Content-Disposition", "attachment;nameSpace=behind;filename="+ URLEncoder.encode("${excelName}.xlsx", "UTF-8"));
OutputStream output = response.getOutputStream();
wb.write(output);
output.flush();

前端:

  1. 解析请求头里面的nameSpace用于判断是需要前端命名还是后端命名
service.interceptors.response.use(
    response => {
        // dataAxios 是 axios 返回数据中的 data
        const dataAxios = response.data;
        // 这个状态码是和后端约定的
        const {code} = dataAxios;
        // 根据 code 进行判断
        // console.log("---code----------",code)
        if (code === undefined) {
            // 如果没有 code 代表这不是项目后端开发的接口
            //1、解析请求头,判断命名方式
            let contentDisposition=response.headers['content-disposition']
            if(contentDisposition&&contentDisposition.indexOf("nameSpace=behind")){
                let temp =contentDisposition.split(";")[2].split("filename=")[1];
                let fileName="None"
                if(temp){
                    //对文件名乱码转义--【Node.js】使用iconv-lite解决中文乱码
                    let iconv = require('iconv-lite');
                    iconv.skipDecodeWarning = true;//忽略警告
                    fileName = decodeURIComponent(temp);
                }else{
                    fileName='None'
                }
                return {Blob:dataAxios,fileName:fileName};
            }else{
                return dataAxios;
            }
        }else if(code === 403){
            router.push('/login');
        } else {
            // 有 code 代表这是一个后端接口 可以进行进一步的判断
            switch (code) {
                case -1:
                    // [ 示例 ] code === -1 代表访问正常,但是后台业务错误返回错误信息
                    errorCreate(` ${dataAxios.data.msg}`);
                    break;
                case 0:
                    // [ 示例 ] code === 0 代表没有错误
                    return dataAxios.data;
                case 'xxx':
                    // [ 示例 ] 其它和后台约定的 code
                    errorCreate(`[ code: xxx ] ${dataAxios.msg}`);
                    break;
                default:
                    // 不是正确的 code
                    errorCreate(`${dataAxios.msg}`);
                    break;
            }
        }
    },
    error => {
        if (error && error.response) {
            switch (error.response.status) {
                case 400:
                    error.message = 'Request error';
                    break;
                case 401:
                    error.message = 'Unauthorized, please login';
                    break;
                case 403:
                    error.message = 'Access denied';
                    break;
                case 404:
                    error.message = `Request address error: ${error.response.config.url}`;
                    break;
                case 408:
                    error.message = 'Request timeout';
                    break;
                case 500:
                    error.message = 'Server internal error';
                    break;
                case 501:
                    error.message = 'Service not implemented';
                    break;
                case 502:
                    error.message = 'Bad Gateway';
                    break;
                case 503:
                    error.message = 'Service not available';
                    break;
                case 504:
                    error.message = 'Gateway timeout';
                    break;
                case 505:
                    error.message = 'The HTTP version is not supported';
                    break;
                default:
                    break;
            }
        }
        errorLog(error);
        return Promise.reject(error);
    }
);

 修改下载确认框中的文件名称

downloadUtil.download = function (res, filename) {
         let dataType=AppConstant.utils.typeOf(res)
        let data=res
        debugger
        if(dataType==="Object"){
            filename=res.fileName
            data=res.Blob
        }else{
            data=res
        }
        //var blob = new Blob([data], {type: 'application/vnd.ms-excel'})接收的是blob,若接收的是文件流,需要转化一下
        if (typeof window.chrome !== 'undefined') {
            // Chrome version
            var link = document.createElement('a');
            link.href = window.URL.createObjectURL(data);
            link.download = filename;
            link.click();
        } else if (typeof window.navigator.msSaveBlob !== 'undefined') {
            // IE version
            var blob = new Blob([data], {type: 'application/force-download'});
            window.navigator.msSaveBlob(blob, filename);
        } else {
            // Firefox version
            var file = new File([data], filename, {type: 'application/force-download'});
            window.open(URL.createObjectURL(file));
        }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值