图片预加载需要token认证的地址处理
1.添加函数修改img的属性;
/**
*
* @param {*} idName 传入的id,获取改img的dom,添加相应的数学
*/
export const proxyImg = (idName) => {
const img = document.getElementById(idName || 'img');
const url = img.getAttribute('authsrc');
const request = new XMLHttpRequest();
request.responseType = 'blob';
request.open('get', url, true);
request.setRequestHeader('x-access-token', localStorage.getItem('x-access-token')); // 换成自己的token
request.onreadystatechange = e => {
if (request.readyState == XMLHttpRequest.DONE && request.status == 200) {
img.src = URL.createObjectURL(request.response);
img.onload = () => {
URL.revokeObjectURL(img.src);
}
}
};
request.send(null);
}
2.处理图片,这里已图片list进行处理为例;
const { proxyImg } = require('@/utils/utils');
import { isEmpty } from 'lodash';
/**
*
* @param {*} imgList 传入的img 是数组 [{fileId: 3318310, fileName: '一张图片', fileSize: "982.00KB" , fileUrl: "/staticResource/images/一张图片.jpg", ...},{}]
* @param {*} field 传入的id,作用是获取img的dom
*/
const dealImgData = (imgList: any[], field: String) => {
if (!isEmpty(imgList)) { // 判断imgList是否为空
imgList.forEach((el, index) => {
// 为什么又判断,就是解决不显示的问题, field都要传......
if(field) {
proxyImg(`img${field}${index}`)
}
});
}
}
3.调用函数;
dealImgData('传入的img的数组', '传入id,随便传,在当前页面是唯一值就OK了’);
备注:可以在componentDidUpdate中调用,也可以在useEffect中调用
备注:
一般加载图片会用到img标签,添加src属性,如下所示:
<img src="imgUrl" />
但是因为需要在get请求头中加入token信息,不能直接将后台返回的图片url直接添加到src 后端返回二进制流,我们需要将二进制流以图片的形式显示在页面中
看到二进制,可以
将responseType 设置为 blob
URL.createObjectURL()
URL.createObjectURL()
静态方法会创建一个DOMString
,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的document
绑定。这个新的URL 对象表示指定的File
对象或Blob
对象。URL.revokeObjectURL()
URL.revokeObjectURL()
静态方法用来释放一个之前已经存在的、通过调用URL.createObjectURL()
创建的 URL 对象。当你结束使用某个 URL 对象之后,应该通过调用这个方法来让浏览器知道不用在内存中继续保留对这个文件的引用了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?