Wiidede's blog Wiidede's blog
  • 前端
  • Python
  • 算法
  • 生活
  • 其他
  • 分类
  • 标签
  • 归档
  • 关于我
  • 赞赏
  • 我的小站 (opens new window)
GitHub (opens new window)

Wiidede

小的的写前端
  • 前端
  • Python
  • 算法
  • 生活
  • 其他
  • 分类
  • 标签
  • 归档
  • 关于我
  • 赞赏
  • 我的小站 (opens new window)
GitHub (opens new window)
  • 整理一些css样式
  • vue隔代组件层层动态插槽并且附带数据
  • vue判断字符串是否溢出来显示弹窗、解决el-table tooltip 内过多导致无法显示,内容闪烁
  • 整理一些js写法
  • ElementUI timePicker 增加此刻按钮 引发的dom操作的学习
  • 毕业设计(水表识别)前端知识整理
  • html小知识
  • axios请求api然后下载文件
  • vue3+ts根据高度改变元素的透明度
  • vue3 + ElementPlus 换肤方案(Css变量)
  • Moment的一些使用方法
  • echarts基础vue组件
  • element UI el-date-picker 年月日切换组件
  • 可以不选择的el-radio单选框
  • vue的小技巧总结
  • 全局动态权限判断(Vue指令)
  • vue-anchor 探索
  • Deep Dive with Evan You 笔记
  • 前端基础知识查漏补缺
  • WebPack 知识总结
  • 我写的一些可以日后参考的代码
  • 接口变化后,封装接口函数,改变返回内容
  • 项目组件整理
  • 前端框架设计想发
  • 全局进度条
  • 带有token的图片vue组件:authImg,使用axios下载图片
  • 前端npm包推荐
  • 给ElInputNumber添加prefix
  • ElPagination添加页数总数
  • el-tab做成chrome类似的tab样式
  • vue-grid-layout-组件配置
  • 项目数据字典封装
  • 图表组件响应式探索
  • ElementPlus表格table列自动合并composition
  • 简单的curd组件封装
  • ElementPlus表格自定义合计列composition
  • 一些处理表格数据composition api
  • div内容溢出后,内容向左悬浮,vue组件封装
  • 文本数字溢出后,按比例缩小,vue组件封装
  • 表格使用async-validator检验composition
  • ElementPlus Form一些简单的组件整合
  • arco-design快速使用tailwind的颜色、unocss动态颜色
  • 前端
wiidede
2022-07-08

带有token的图片vue组件:authImg,使用axios下载图片

# 带有token的图片vue组件:authImg,使用axios下载图片

使用axios下载图片

<template>
  <div
    v-loading="loading"
    class="img-container"
  >
    <img
      v-if="src"
      :src="src"
      v-bind="$props"
      v-on="$listeners"
    />
  </div>
</template>
<script>
import axios from 'axios';
import Auth from 'utils/auth';

export default {
  name: 'authImg',
  props: {
    authSrc: {
      type: String,
      default: ''
    }
  },
  data() {
    return {
      src: '',
      loading: false,
      imageBlob: null
    };
  },
  watch: {
    authSrc: {
      handler(val) {
        this.revokeUrl();
        this.imageBlob = null;
        this.getImg(val);
      },
      immediate: true
    }
  },
  beforeDestroy() {
    this.revokeUrl();
  },
  methods: {
    async getImg(url) {
      if (!url) {
        return;
      }
      const instance = axios.create({
        headers: {
          'jwt-token': Auth.getJwtToken()
        },
        responseType: 'blob'
      });
      this.loading = true;
      const res = await instance.request({
        url,
        method: 'get'
      }).catch(e => {
        console.error(e);
        this.src = url;
        this.imageBlob = null;
      }).finally(() => {
        this.loading = false;
      });
      const contentType = (res.headers['content-type'] && res.headers['content-type'].split(';')[0]) ||
        'application/octet-stream';
      if (contentType.includes('image')) {
        this.imageBlob = res.data;
        this.src = URL.createObjectURL(res.data);
      } else {
        this.imageBlob = null;
        this.src = url;
        // 错误处理
        if (contentType.startsWith('application/json')) {
          const rawText = await res.data.text();
          const raw = JSON.parse(rawText);
          if (raw.code && raw.code !== 0) {
            this.$message.error(raw.message);
          }
        }
      }
    },
    getImageBlob() {
      return this.imageBlob;
    },
    revokeUrl() {
      if (this.src.startsWith('blob')) {
        URL.revokeObjectURL(this.src);
        this.src = '';
      }
    }
  }
};
</script>

<style scoped>
.img-container {
  height: 100%;
}
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#前端#Vue#Vue组件#axios
上次更新: 2023/06/01, 12:40:50

← 全局进度条 前端npm包推荐→

Theme by Vdoing | Copyright © 2021-2023 Wiidede | Website use MIT License | Article content & logo use CC-BY-SA-4.0 License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式