搜 索

axios通过get请求获取图片的文件流时遇到的问题(附常用axios封装模板)

  • 948阅读
  • 2023年08月16日
  • 17评论
首页 / 前端技术 / 正文

最近遇到的问题,一个图片的链接,通过get请求获取其文件流

this.$get(url, {}, {
    responseType: "blob"
}).then(res => {
    let file = new File([res], "1.jpg", {
        type: "image/jpeg",
        lastModified: new Date().getTime()
    })
    console.log(file)
})
// 上面是使用,下面是封装部分
/**
 * get方法,对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 * @param {Object} headers [请求时携带的hearder]
 */
export function get(url, params = {}, headers = {}) {
    return new Promise((resolve, reject) => {
        axios.get(url, {
            params: params,
            headers: headers
        }).then(res => {
            resolve(res.data);
        }).catch(err => {
            reject(err);
        });
    });
}

在通过以上代码调用后,获取的file始终大小不对,且不能看到图片,在查询问题后,发现在axios中,responseType并不是放在headers中,而是在外面,故封装部分代码应为

/**
 * get方法,对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 * @param {Object} headers [请求时携带的hearder]
 */
export function get(url, params = {}, headers = {}) {
    return new Promise((resolve, reject) => {
        axios.get(url, {
            params: params,
            responseType: headers.responseType ? headers.responseType : "json",
            headers: headers
        }).then(res => {
            resolve(res.data);
        }).catch(err => {
            reject(err);
        });
    });
}

既responseType是在axios.get的config中,但是是跟headers同级,此时获取的res.data就是一个blob对象,可以直接放进file中使用

this.$get(url, {}, {
    responseType: "blob" // 在封装代码中,我从header中取responseType
}).then(res => {
    let file = new File([res], "1.jpg", {
        type: "image/jpeg",
        lastModified: new Date().getTime()
    })
    console.log(file)
})

后提供一个我自己常用的axios封装模板文件,项目使用的是vite+vue+element

import axios from "axios";
import {Message} from "element-ui";

// 环境的切换
if (import.meta.env.VITE_ENV === "dev") {
    axios.defaults.baseURL = ""; //本地测试
} else if (import.meta.env.VITE_ENV === "prod") {
    axios.defaults.baseURL = ""; //发布版本
}
axios.defaults.timeout = 60000;
axios.defaults.headers.post["Content-Type"] = "application/json;charset=UTF-8";

// 请求拦截器
axios.interceptors.request.use(
    config => {
        return config;
    },
    error => {
        return Promise.error(error);
    });

// 响应拦截器
axios.interceptors.response.use(
    response => {
        if (response.status == 200) {
            return Promise.resolve(response);
        } else {
            return Promise.reject(response);
        }
    },
    // 服务器状态码不是200的情况
    error => {
        if (error.response && error.response.status) {
            switch (error.response.status) {
                case 404:
                    Message({
                        type: "error",
                        message: "网络中断或该请求不存在"
                    });
                    break;

                // 其他错误,直接抛出错误提示
                default:
                    Message({
                        type: "error",
                        message: error.response.data.msg
                    });
                    break;
            }
            return Promise.reject(error.response);
        } else {
            if (error.message.indexOf(JSON.stringify(axios.defaults.timeout)) != -1) {
                Message({
                    type: "error",
                    message: "接口请求时长超过" + axios.defaults.timeout / 1000 + "s"
                });
            } else {
                Message({
                    type: "error",
                    message: "Network Error"
                });
            }
            return Promise.reject(error.message);
        }
    }
);

/**
 * get方法,对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 * @param {Object} headers [请求时携带的hearder]
 */
export function get(url, params = {}, headers = {}) {
    return new Promise((resolve, reject) => {
        axios.get(url, {
            params: params,
            responseType: headers.responseType ? headers.responseType : "json",
            headers: headers
        }).then(res => {
            resolve(res.data);
        }).catch(err => {
            reject(err);
        });
    });
}

/**
 * post方法,对应post请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 * @param {Object} hearder [请求时携带的hearder]
 */
export function post(url, params = "", hearder = {}) {
    return new Promise((resolve, reject) => {
        axios.post(url, params, hearder).then(res => {
            resolve(res.data);
        }).catch(err => {
            reject(err);
        });
    });
}

/**
 * 不常用的接口方法,对应put,del请求
 * @param {String} type [请求类型,put,delete]
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 * @param {Object} hearder [请求时携带的hearder]
 */
export function request(type, url, params = "", hearder = {}) {
    return new Promise((resolve, reject) => {
        axios[type](url, params, hearder).then(res => {
            resolve(res.data);
        }).catch(err => {
            reject(err);
        });
    });
}

使用方法如下,在main.js中

import {post, get, request} from "./request/http";
Vue.prototype.$post = post;
Vue.prototype.$get = get;
Vue.prototype.$request = request;
评论区

《华纳圣淘沙公司开户流程全解析》→ 官方顾问一对一指导??? 安全联系:183第三段8890第四段9465
《华纳圣淘沙开户步骤详解》→ 」专属通道快速办理??? 安全联系:183第三段8890第四段9465
《华纳圣淘沙账户注册指南》→ 扫码获取完整资料清单?「微?? 安全联系:183第三段8890第四段9465
《新手开通华纳圣淘沙公司账户指南》→ 限时免费咨询开放??? 安全联系:183第三段8890第四段9465
《华纳圣淘沙企业开户标准流程》→ 资深顾问实时解答疑问??? 安全联系:183第三段8890第四段9465
《华纳圣淘沙开户步骤全景图》→ 点击获取极速开户方案??? 安全联系:183第三段8890第四段9465
《华纳圣淘沙账户创建全流程手册》→ 预约顾问免排队服务?9?? 安全联系:183第三段8890第四段9465 《从零开通华纳圣淘沙公司账户》→ 添加客服领取开户工具包?? 安全联系:183第三段8890第四段9465
《官方授权:华纳圣淘沙开户流程》→ 认证顾问全程代办?」?? 安全联系:183第三段8890第四段9465
《华纳圣淘沙开户说明书》→立即联系获取电子版文件??? 安全联系:183第三段8890第四段9465

寻找华纳圣淘沙公司开户代理(183-8890-9465薇-STS5099】

华纳圣淘沙官方合作开户渠道(183-8890-9465薇-STS5099】

华纳圣淘沙公司开户代理服务(183-8890-9465薇-STS5099】

华纳圣淘沙公司开户咨询热线(183-8890-9465薇-STS5099】

联系客服了解华纳圣淘沙开户

(183-8890-9465薇-STS5099】
华纳圣淘沙公司开户专属顾问

(183-8890-9465薇-STS5099】

寻找华纳圣淘沙公司开户代理(183-8890-9465薇-STS5099】

华纳圣淘沙官方合作开户渠道(183-8890-9465薇-STS5099】

华纳圣淘沙公司开户代理服务(183-8890-9465薇-STS5099】

华纳圣淘沙公司开户咨询热线(183-8890-9465薇-STS5099】

联系客服了解华纳圣淘沙开户

(183-8890-9465薇-STS5099】
华纳圣淘沙公司开户专属顾问

(183-8890-9465薇-STS5099】

东方明珠客服开户联系方式【182-8836-2750—】?μ- cxs20250806
东方明珠客服电话联系方式【182-8836-2750—】?- cxs20250806】
东方明珠开户流程【182-8836-2750—】?薇- cxs20250806】
东方明珠客服怎么联系【182-8836-2750—】?薇- cxs20250806】

新盛客服电话是多少?(?183-8890-9465—《?薇-STS5099】【
新盛开户专线联系方式?(?183-8890--9465—《?薇-STS5099】【?扣6011643??】
新盛客服开户电话全攻略,让娱乐更顺畅!(?183-8890--9465—《?薇-STS5099】客服开户流程,华纳新盛客服开户流程图(?183-8890--9465—《?薇-STS5099】

华纳东方明珠客服电话是多少?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】
华纳东方明珠开户专线联系方式?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】

华纳东方明珠客服电话是多少?(▲18288362750?《?微信STS5099? 】
如何联系华纳东方明珠客服?(▲18288362750?《?微信STS5099? 】
华纳东方明珠官方客服联系方式?(▲18288362750?《?微信STS5099?
华纳东方明珠客服热线?(▲18288362750?《?微信STS5099?
华纳东方明珠24小时客服电话?(▲18288362750?《?微信STS5099? 】
华纳东方明珠官方客服在线咨询?(▲18288362750?《?微信STS5099?

华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099

华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099
华纳公司合作开户所需材料?电话号码15587291507 微信STS5099

huarbvfwnv 2025年10月7日 11:47
回复 取消

2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com

ubmnuopzch 2025年10月5日 08:37
回复 取消

新车即将上线 真正的项目,期待你的参与coinsrore.com

zeaoufohdc 2025年10月5日 07:34
回复 取消

新车即将上线 真正的项目,期待你的参与

txhirlufpv 2025年10月5日 07:34
回复 取消

新项目准备上线,寻找志同道合的合作伙伴

qjeaabcgvt 2025年3月3日 06:27
回复 取消

思想的火花在字句间迸发,照亮认知盲区。

qqsnczbkpx 2025年3月3日 04:44
回复 取消

存在主义视角的介入提升了思想维度。

klvocbyvqo 2025年3月1日 03:53
回复 取消

作者的才华横溢,让这篇文章成为了一篇不可多得的艺术品。

dlrxyswyik 2025年3月1日 03:32
回复 取消

每一个段落都紧密相连,逻辑清晰,展现了作者高超的写作技巧。

avatar