• vue2 解密图片地址(url)-使用blob文件-打开png格式图片


    一、背景

    开发中需要对加密文件进行解码,如图片等静态资源。

    根据后端给到的url地址,返回的是图片文件,但是乱码的,需要解码成png图片进行展示

    二、请求接口

    将后端返回的文件转为文件流,创建Blob对象来存储二进制数据,通过URL.createObjectURL()方法创建二进制数据的URL,将URL赋值给imgData以显示图片。

    1. //初始化图片数据并进行处理
    2. initImg() {
    3. this.isLoading = true
    4. //请求携带的参数
    5. let param = {
    6. printType: this.printType,
    7. orderIdList: Array.isArray(this.orderIdList) ? this.orderIdList : this.orderIdList.split(','),
    8. billTypeList: this.billType.split(',')
    9. }
    10. let promise
    11. //发请求,此处是封装的请求
    12. promise = this.$http.any('post', `${this.$url.payList.getPrintReceipt}`, {}, param, null, 'blob')
    13. // 发起POST请求,获取打印收据的二进制数据,并将结果赋值给promise变量
    14. promise
    15. .then((res) => {
    16. let reader = new FileReader() // 创建FileReader对象,用于读取二进制
    17. let response = null
    18. reader.onload = () => {
    19. // 如果读取的结果是以'{'开头,则将其解析为JSON对象
    20. if (reader.result[0] == '{') {
    21. response = JSON.parse(reader.result)
    22. this.$message.error(response.msg)
    23. } else {
    24. this.inChooseCharge = false
    25. let fileType = 'png' // 设置文件类型为png
    26. let blob = new Blob([res], { type: `application/${fileType}` }) // 创建Blob对象,用于存储二进制数据
    27. let data = window[window.webkitURL ? 'webkitURL' : 'URL']['createObjectURL'](blob) // 通过URL.createObjectURL()方法创建二进制数据的URL
    28. this.imgData = data // 将URL赋值给imgData,用于显示图片
    29. console.log('printinitImg -- imageData', this.imgData)
    30. let img = new Image()
    31. // 当图片加载完成时执行回调函数
    32. img.onload = () => {
    33. //对图片宽高比进行判断
    34. if (img.width / img.height >= 1100 / 595) {
    35. this.fitWidth = true
    36. } else {
    37. this.fitWidth = false
    38. }
    39. this.$nextTick(() => {
    40. this.popupDoLayout()
    41. })
    42. }
    43. img.src = this.imgData
    44. }
    45. this.isLoading = false
    46. }
    47. reader.readAsText(res, 'utf-8') // 以文本格式读取二进制数据
    48. })
    49. .catch((error) => {
    50. this.isLoading = false
    51. console.log('请求失败:', error)
    52. })
    53. }

    说明:发请求时要说明是转换成blob ,再创建Blob对象,存储二进制数据。最主要的还是要多打日志,看每一步的结果,再做对应操作!!!

    MDN文件参考:👉URL.createObjectURL() - Web API 接口参考 | MDN

    三、结构

    使用img展示图片,利用element的image-viewer来进行图片缩放,需要从element中引入

    1. class="main print-box" :class="{ 'fit-width': fitWidth, 'fit-height': !fitWidth }" v-else>
    2. <img class="img" :src="imgData" alt="预览图" @load="popupDoLayout" @click="imgData ? getShowViewer(imgData) : null" />
    3. <div class="flex bottom-box">
    4. <el-button type="primary" @click="print" :disabled="!imgData">打印el-button>
    5. div>
  • <el-image-viewer v-if="showViewer" :on-close="closeViewer" :url-list="viewerImgList" />
  •  从element中引入image-viewer使用👇

    最后,👏👏 😀😀😀 👍👍 

  • 相关阅读:
    js字符串转时间戳
    idea 打开文件一直loading
    MapReduce编程:检索特定群体搜索记录和定义分片操作
    从头开始进行CUDA编程:Numba并行编程的基本概念
    java计算机毕业设计基于安卓Android微信的酒店宾馆预约预定管理系统 uniAPP
    前几天,小灰去贵州了
    从购买云服务器开始到成功部署网站并且可以正常外网访问整个体系流程(从0到1的过程)
    【gmoj】旅行
    【数据聚类】第八章第二节:谱聚类算法之切图聚类、算法流程及其实现
    java基于springboot+vue的汉服推广与交流平台
  • 原文地址:https://blog.csdn.net/weixin_71403100/article/details/133896220