axios获取二进制图片并显示在img标签

本文介绍了一种获取二进制文件流的方法,并演示了如何将返回的ArrayBuffer转换为BlobURL,以便在Web环境中预览或下载图片。通过Promise处理异步请求,确保了流程的流畅性和用户体验。

一、获取文件流

/**
 * 获取二进制文件流
 * @param {string} url 系统API
 * @param {object} param 参数
 * @param {boolean} showcode msg提示
 * @param {boolean} layout 加载层
 */
const buffer=(url, param, showcode = false, layout = false)=>{
  let load=new loading(wuConfig.timeout);
  load.openLoading(layout)

  return new Promise((resolve, reject) => {
    apiInstance({
      method: "get",
      url: url,
      data: param,
      responseType: "arraybuffer"
    }).then(res=>{
      // if (res.headers["content-type"] === "application/json;charset=UTF-8") {
      //   let uint8 = new Uint8Array(res.data); // 提取uint8Array
      //   let resToString = JSON.parse(
      //     decodeURIComponent(escape(String.fromCharCode(...uint8)))
      //   ); // 解决乱码
      //   load.closeLoading();
      //   load.showcode(resToString.code,resToString.message,showcode)
      //   resolve(res);
      // } else {
      //   resolve(res);
      // }
      resolve(res);
    }).catch(err=>{
      reject(err);
    })
  })
}

二、转换blobURL

buffer("/api/img", {}, false,true).then(res => {
        if (res.status == 200) {
          let blob = new Blob([res.data], { type: "image/png" });
          let imageUrl = (window.URL || window.webkitURL).createObjectURL(blob);
          console.log(imageUrl);//img url
        }
      });

 

<think>嗯,用户现在想了解如何通过axios获取后端的图片资源展示在页面上。首先,我需要回顾一下之前的问题。之前用户问过如何在Vue组件中导入axios,现在这个问题是后续的应用场景,涉及到如何处理图片资源的获取和展示。 首先,用户可能已经按照之前的指导安装了axios知道如何在组件中导入,无论是全局还是局部。现在的问题是如何使用axios获取图片显示出来。可能需要考虑几个方面:请求的配置、处理二进制数据、前端如何将获取图片数据转换为可显示的格式。 用户可能不太清楚如何正确设置axios的响应类型,因为图片通常是二进制数据,比如Blob或ArrayBuffer。默认情况下,axios可能会将响应作为JSON处理,这会导致图片数据无法正确解析。所以需要设置responseType为'blob',这是关键的一步。 接下来,用户可能需要知道如何将获取的Blob数据转换为前端可以显示的URL。使用URL.createObjectURL方法可以将Blob转换为一个临时URL,这样就可以在img标签的src属性中使用了。同时,还需要注意在组件销毁时释放这个URL,避免内存泄漏,这一点可能需要提醒用户。 另外,用户可能想知道如何处理可能的错误,比如网络问题或图片不存在的情况,这时候需要在axios的catch块中进行错误处理,或者使用try...catch配合async/await。此外,加载状态的提示也是一个好的用户体验,可以添加加载中的状态反馈。 还有,用户可能对跨域问题有疑问,特别是如果后端没有正确配置CORS,前端可能无法获取图片。这时候可能需要配置代理或者让后端设置合适的CORS头。之前的回答中已经提到了跨域的解决方法,可能需要再次提及或链接到之前的建议。 另外,用户可能想知道是否有其他方法,比如直接使用img标签的src指向后端图片URL,而不是通过axios获取。但有些情况下,比如需要授权头或处理二进制数据时,使用axios是必要的。需要解释这两种方法的适用场景。 还有,可能需要提供一个完整的组件示例,展示从发送请求到显示图片的整个过程,包括处理加载状态和错误。这样用户可以直接参考代码结构,理解各个部分的作用。 最后,总结关键点:设置responseType为'blob',转换Blob为URL,释放内存,错误处理和加载状态。可能还需要提到性能优化,比如缓存图片或使用Base64编码,但根据用户的问题,可能暂时不需要深入,除非用户有进一步的需求。 需要确保回答清晰,步骤明确,代码示例正确,且覆盖用户可能遇到的问题,比如跨域、内存泄漏、错误处理等。同时,语言要简洁,符合中文表达习惯,避免技术术语过于复杂,必要时进行解释。</think>通过 `axios` 获取后端图片资源展示在前端页面,需要 **正确处理二进制数据(Blob)** 生成可预览的 URL。以下是详细步骤和代码示例: --- ### **一、核心步骤** 1. **发送请求时设置 `responseType: 'blob'`** 明确告知 `axios` 返回二进制数据(如图片、文件等)。 2. **将 Blob 转换为可显示的 URL** 使用 `URL.createObjectURL()` 将二进制数据转为临时 URL,供 `<img>` 标签加载。 3. **释放内存(可选但建议)** 在组件销毁时调用 `URL.revokeObjectURL()` 清理临时 URL,避免内存泄漏。 --- ### **二、完整代码示例(Vue.js)** ```vue <template> <div> <!-- 加载状态 --> <div v-if="loading">图片加载中...</div> <!-- 错误提示 --> <div v-if="error" style="color: red;">{{ error }}</div> <!-- 图片展示 --> <img v-if="imageUrl" :src="imageUrl" alt="后端图片" /> </div> </template> <script> import axios from 'axios'; export default { data() { return { imageUrl: null, // 存储图片的临时 URL loading: false, // 加载状态 error: null // 错误信息 }; }, methods: { async fetchImage() { this.loading = true; this.error = null; try { // 关键:设置 responseType 为 'blob' const response = await axios.get('https://api.example.com/image', { responseType: 'blob' }); // 将 Blob 数据转为临时 URL const blob = new Blob([response.data], { type: response.headers['content-type'] }); this.imageUrl = URL.createObjectURL(blob); } catch (err) { this.error = '获取图片失败:' + (err.message || '未知错误'); } finally { this.loading = false; } } }, mounted() { this.fetchImage(); // 组件加载时自动获取图片 }, beforeDestroy() { // 组件销毁时释放临时 URL(避免内存泄漏) if (this.imageUrl) { URL.revokeObjectURL(this.imageUrl); } } }; </script> ``` --- ### **三、关键细节说明** #### **1. 设置 `responseType: 'blob'`** - **作用**:明确告诉 `axios` 返回二进制数据(Blob 对象),而不是默认的 JSON 或文本。 - **错误示例**:如果未设置此参数,图片数据可能被错误解析成字符串,导致无法显示。 #### **2. 生成临时 URL** - **`URL.createObjectURL(blob)`**:将 Blob 转换为一个可访问的 URL(如 `blob:http://localhost:8080/550e8400-e29b...`)。 - **注意**:生成的 URL 仅在当前页面会话中有效,页面关闭后自动释放。 #### **3. 手动释放内存** - **`URL.revokeObjectURL()`**:主动释放临时 URL 占用的内存(建议在组件销毁时调用)。 --- ### **四、常见问题** #### **Q1:图片显示为空白或损坏** - **检查步骤**: 1. 确认后端返回的 HTTP 状态码是 200,且 `Content-Type` 头正确(如 `image/png`)。 2. 检查浏览器控制台是否有跨域错误(需后端配置 CORS 或前端代理)。 3. 确保 `responseType: 'blob'` 已设置。 #### **Q2:如何传递请求参数或 Token?** - **示例**: ```javascript axios.get('/image', { responseType: 'blob', params: { id: 123 }, // 查询参数 headers: { Authorization: 'Bearer xxx' // 身份验证 Token } }) ``` #### **Q3:是否可以直接用 `<img>` 标签的 `src` 属性加载图片?** - **可以,但有限制**: 如果图片无需鉴权且允许跨域,可以直接用: ```vue <img src="https://api.example.com/image?id=123" /> ``` - **需用 `axios` 的场景**: 需要添加请求头(如 Token)或处理二进制数据(如动态修改图片)。 --- ### **五、优化建议** 1. **统一封装请求** 将 `axios` 实例封装在单独文件中,统一处理 `responseType` 和错误拦截。 ```javascript // utils/request.js import axios from 'axios'; const http = axios.create({ baseURL: 'https://api.example.com', responseType: 'blob' // 全局默认设为 Blob }); export default http; ``` 2. **显示加载占位图** 在图片加载完成前展示占位符,提升用户体验: ```vue <img :src="imageUrl || '/placeholder.png'" /> ``` 3. **处理大文件分片** 若图片较大,可结合 `Range` 请求头实现分片加载。 --- 通过以上方法,你可以高效地通过 `axios` 获取展示后端图片资源,同时兼顾性能和安全性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值