1.下载文件封装

import request from './request'

export function download(url, params,filename) {
    request({
        method: 'get',
        params: params,
        url: url,
        responseType: 'blob',
        timeout: 0
    }).then(res => {
        resolveBlob(res, filename)
    }).catch((error) => {
        console.log(error)
        for (let e in error) {
            console.log(e, error[e])
        }

});
}

function resolveBlob(res, fileName) {
    const aLink = document.createElement('a')
    let blob = new Blob([res.data])
    if (!fileName) {
        //if not set filename, getting from response header, match regExp:
        // response.setHeader("Content-disposition", "attachment; filename=sample.docx"); or
        // response.setHeader("Content-disposition", "attachment; filename*=utf-8''sample.docx");
        let regExp = new RegExp('filename(?:=|\\*=.+\'\')([^;]+\.[^\.;]+);*');
        let contentDisposition = decodeURI(res.headers['content-disposition'])
        let result = regExp.exec(contentDisposition)
        if (result && result.length > 1 ) {
            fileName = result[1]
            fileName = fileName.replace(/\"/g, '')
        } else {
            fileName = new Date().getTime();
        }
    }

if (window.navigator.msSaveOrOpenBlob) {
        navigator.msSaveBlob(blob, fileName);
    } else {
        aLink.href = URL.createObjectURL(blob)
        aLink.setAttribute('download', fileName) // 设置下载文件名称
        aLink.click()
        window.URL.revokeObjectURL(aLink.href);
    }
}

2.request请求封装

import axios from 'axios'
import qs from 'qs'
import {Message} from 'element-ui'
import md5 from 'js-md5'
import {getToken, getAccessToken} from "@/utils/auth";
import router from "@/router";
import store from "@/store";
import APP_CONFIG from "../config/config";

/** http error */
const HTTP_ERROR = {
    UNAUTHORIZED: {
        code: 401,
        msg: '请求未授权',
    },
    FORBIDDEN: {
        code: 403,
        msg: '无权查看',
    },
    NOT_FOUND: {
        code: 404,
        msg: '请求地址不存在',
    },
    METHOD_NOT_ALLOWED: {
        code: 405,
        msg: '请求方式不支持',

},
    NOT_ACCEPTABLE: {
        code: 406,
        msg: '请求被拒绝',
    },
    LENGTH_REQUIRED: {
        code: 411,
        msg: '长度受限',
    },
    UNSUPPORTED_MEDIA_TYPE: {
        code: 415,
        msg: '不支持的媒体类型',
    },
    SERVER_ERROR: {
        code: 500,
        msg: '服务器错误'
    },
    BAD_GATEWAY: {
        code: 502,
        msg: '服务器未响应'
    },
    SERVICE_UNAVAILABLE: {
        code: 503,
        msg: '当前服务暂不可用'
    },
    UNKNOWN: {
        code: 996,
        msg: '未知错误'
    },
    NETWORK_ERROR: {
        code: -1,
        msg: '网络错误'
    }
}

/**sign key**/
const SIGN_KEY = '123456789';

/**
 * sort & serialize query
 * @param arg
 * @returns {string}
 */
function prepareQuery(arg) {
    const names = Object.keys(arg).sort()
    let ret = ''
    for (let i = 0; i < names.length; ++i) {
        const name = names[i]
        const val = arg[name]
        if (val === false) {
            ret += (name + '0')
        } else if (val === true) {
            ret += (name + '1')
        } else if (typeof val === 'number') {
            ret += (name + val)
        } else if (typeof val === 'string') {
            ret += (name + val)
        } else if (Array.isArray(val)) {
            ret += (name + val.join(','))
        } else if (val) {
            ret += (name + JSON.stringify(val))
        } else {
            ret += name
        }
    }
    return ret
}

/**
 * show error tips with element ui message component
 * @param cfg
 */
function showErrorMessage(cfg) {
    Message({
        message: cfg.msg,
        type: 'error',
        duration: 5 * 1000
    })
}

/**
 * check token valid, if token expired ,refresh token
 */
function checkToken() {
    let token = getToken();
    if (token && isTokenNeedRefresh(token)) {
        refreshToken();
    }
}

/**
 * check token expired time, if left time < expired/5, refresh token
 * @param token
 * @returns {boolean|boolean}
 */
function isTokenNeedRefresh(token) {
    let now = new Date().getTime();
    let expiredTime = token.ts + (token.expired * 1000);
    let time = expiredTime - now;
    return time > 0 && time < (token.expired / 5 * 1000)

}

/**
 * refresh token
 * simple implements, use old token to get new token
 */
function refreshToken() {
    const time = String(new Date().getTime())
    axios.get(baseURL + "/auth/refresh", {
        headers: {
            Authorization: getAccessToken(),
            sign: md5(SIGN_KEY + time),
            timestamp: time
        }
    }).then((res) => {
        if (res.status === 200) {
            if (res.data && res.data.code === 200 && res.data.data) {
                let tokenObj = {
                    token: res.data.data.token,
                    expired: res.data.data.expired,
                    ts: new Date().getTime()
                }
                store.dispatch("user/setUserToken", tokenObj)
            } else {
                processSystemError(res)
            }
        }

}).catch((error) => {
        processHttpError(error)
    });
}

/**
 * show system error message
 * @param response
 */
function processSystemError(response) {
    let cfg = {
        code: response.data.code,
        msg: response.data.msg,
    }
    showErrorMessage(cfg);
    if (response.data.code === 601) {
        router.push({
            path: '/login'
        });
    }
}

/**
 * show http error message
 * @param error
 */
function processHttpError(error) {
    let httpError = HTTP_ERROR.NETWORK_ERROR;
    if (error.response) {
        for (const httpStatus in HTTP_ERROR) {
            let e = HTTP_ERROR[httpStatus];
            if (e && e.code === error.response.status) {
                httpError = e;
                break;
            }
        }
    }
    showErrorMessage(httpError);
}

const baseURL = APP_CONFIG.VUE_APP_API_HOST_DEFAULT;

const service = axios.create({
    baseURL: baseURL,       // url = base url + request url
    withCredentials: false, // do not need cookie
    timeout: 1000 * 10
})

/** request interceptor */
service.interceptors.request.use(
    config => {
        // refresh token if expired
        checkToken(config);
        let serializedData = '';
        if (config.method === 'get' || config.method === 'delete') {
            if (config.params && Object.getOwnPropertyNames(config.params).length) {
                serializedData = prepareQuery(config.params);
                // array params formatter, a:[1,2,3] => a=1,2,3
                config.paramsSerializer = function (params) {
                    return qs.stringify(params, {arrayFormat: 'comma'})
                }
            }
        } else {
            if (config.data && !(config.data instanceof FormData)) {
                serializedData = JSON.stringify(config.data);
            }
        }
        const time = String(new Date().getTime())
        config.headers['timestamp'] = time
        config.headers['sign'] = md5(SIGN_KEY + time + serializedData)
        let accessToken = getAccessToken();
        if (accessToken) {
            config.headers['Authorization'] = accessToken;
        }
        return config
    },
    error => {
        return Promise.reject(error)
    }
)

/** response interceptor **/
service.interceptors.response.use(
    response => {
        if (response.status === 200) {
            // pre-processing json response
            if (response.headers['content-type'].indexOf("application/json") != -1) {
                if (response.data.code === 200) {
                    return response.data
                }else if(getToken().token === "mock"){
                    return response.data
                } else {
                    processSystemError(response)
                    return Promise.reject(response.data)
                }
            } else {
                return Promise.resolve(response);
            }
        }
    },
    error => {
        processHttpError(error);
        return Promise.reject(error)
    }
)

export default service

3.使用

import {download} from '@/utils/download'
//批量导出
    getExcel() {
      download("/report/getAccident",this.baseQueryForm,"中粮贸易小事故信息统计报表.xlsx")
    },

下载---当前端调用下载文件接口,接口通了,浏览器却没有下载文件(不一定好使)相关推荐

  1. java 安卓 html文件怎么打开方式_android 浏览器 打开本地html文件的方法

    android 浏览器 打开本地html文件的方法有些html文件放在本地磁盘和sdcard,如何用打开这个网页呢? 这种应用在测试时非常有用. 有2个方法: 1. 使用文件管理器 如ES等,需要幸运 ...

  2. 为什么浏览器中有些文件点击后是预览,有些是下载

    今天给大家分享两个比较有用的浏览器行为与预期不一致的现象,这两个问题其实并不是什么难题,但在工作中发现不少人被难住了,在我的印象中至少有三位同事在群里问这样的问题,上周又有同事被此现象困住了,所以我觉 ...

  3. 两步快速解决浏览器上传本地文件失败问题

    两步快速解决浏览器上传本地文件失败问题 学校教学平台上传作业总是没法弹出本地目录,经过查资料和试验,我总结了解决方法,只需两步. 使用到的浏览器 ie浏览器 目录 两步快速解决浏览器上传本地文件失败问 ...

  4. 微信或手机浏览器在线显示pdf文件

    问题及解决 在之前的文章中提到了如何在手机上显示office文件,这里提一下pdf文件如何在手机上展示.问题发生情况是,公司企业号会从OA系统定时获取信息,并且解析内网文章中的图片.文件,展示在微信中 ...

  5. 手机火狐浏览html文件在哪里,火狐手机浏览器书签在哪?

    先来看看用狐火浏览器中添加的书签,这些书签就是要保存下来再次利用的 第一种方法 在电脑上一次找到C:\Documents and Settings\Administrator\Application ...

  6. 根据接口文档书写接口,并在前端调用接口返回显示出数据(加下载)

    ---恢复内容开始--- 1.首先来看接口文档(其中一个接口): 接口的编写: 1 /** 2 * 7.11 余额明细查询接口3 *4 *@paramtoken5 *@parampageNum6 * ...

  7. 微信扫描二维码在内置浏览器打不开文件的下载链接怎么办?哪些api接口可以解决...

    有哪些api接口可以实现微信扫描二维码在内置浏览器打开文件的下载链接? 经常看到贴吧上有人吐槽微信的检测系统太严格了,动不动就拦截第三方链接.怎么才能解决,怎么才能避免等等一系列的问题.因为平时我也会 ...

  8. swagger文档无法测试下载文件的接口解决方式

    在开发中偶尔会遇到需要下载文件的接口,文件输入输出流的使用和转换的操作 当接口开发完毕的时候去swagger文档中测试发现结果只是乱码如下图: swagger文档通常情况下是没法测试下载接口的,需要修 ...

  9. FastDFS自定义水印的文件上传(前端调用后端接口)

    之前写了普通的文件上传,考虑到可能有些公司的文件会有版权问题,因此加上带水印的文件上传功能. controller: /*** 文件上传带水印格式,支持PDF/图片* @param file* @pa ...

最新文章

  1. 洛谷 P3302 [SDOI2013]森林 主席树+启发式合并
  2. Linux下tomcat内存溢出分析及优化
  3. CaseStudy(showcase)界面篇-导出xaml以及放入Blend的技巧
  4. Android中使用retrofit2进行网络get请求查询数据和post请求上传文件
  5. java综合项目推荐,推荐20个5月最热门的Java开源项目
  6. xorg.conf变更导致开机无法显示
  7. shp设置utf8格式_shapefile与字符集编码设置
  8. SharePoint对象模型性能考量
  9. 两种方法上传本地文件到github
  10. 信息论与编码冯桂周林著答案_信息论与编码技术+(冯桂+林其伟+陈东华+著)+清华大学出版社+课后答案.pdf...
  11. 逻辑数据库设计 - 可变属性(继承)
  12. 灰度共生矩阵纹理特征提取matlab,灰度共生矩阵纹理特征提取的Matlab实现
  13. Datawhale组队学习(Pandas) task8-文本数据
  14. inter服务器修改ip地址,如何更改您的IP地址(公共IP和本地IP)
  15. layui修改表格行高
  16. 【历史上的今天】12 月 27 日:第一台计算机背后的女性们;Box 创始人出生;开普勒诞生
  17. 队列的定义及其基本操作
  18. 谷歌学术检索论文如何指定多个来源
  19. 【产品笔记】2.互联网产品修炼
  20. php slim get,php – 在Slim上获取请求参数

热门文章

  1. jpg和jpeg图片有区别吗?
  2. 分类问题结果统计指标的解释:真正类率TPR与假正类率FPR、查全率与查准率、感受性与特异性
  3. 【QCA】ubuntu1804 与 QSDK 编译环境适配问题
  4. 工信部《VR产业白皮书》全文 官方解读虚拟现实
  5. 怎么样才能降低职称论文查重率?
  6. 云服务器配置ftp、企业官网、数据库等方法
  7. Linux第二次试验:Linux下的进程通信实验
  8. 绝地求生linux版本,别吃鸡游戏下载-别吃鸡官方版v1.0-Linux公社
  9. 高通平台实现桥接功能Bridge_Service
  10. Gps如何根据两点(经纬度)计算直线距离