【日常记录】【JS】前端预览图片的两种方式,Base64预览和blob预览
嘤嘤怪呆呆狗 2024-07-12 13:03:01 阅读 79
文章目录
1、前言1、FileReader3、window.URL.createObjectURL4、参考链接
1、前言
一般来说,都是 后端返回给前端图片的<code>url,前端直接把这个值插入到 img 的src 里面即可还有一种情况是前端需要预览一下图片,比如:上传头像按钮,前端需要临时 预览一下图片
这个时候就有两种方案了
方式一 转base64预览方式二 生成blob图片预览路径url
1、FileReader
可以利用 FileReader 把文件转成 base64格式
<!DOCTYPE html>
<html lang="en">code>
<head>
<meta charset="UTF-8">code>
<meta name="viewport" content="width=device-width, initial-scale=1.0">code>
<title>Document</title>
</head>
<body>
<input id="file1" type="file" value="FileReader.readAsDataURL 方式" multiple>code>
<script>
let file1El = document.querySelector('#file1')
file1El.addEventListener('change', function (e) {
// 可能会上传多个文件
let files = e.target.files
console.log('files', files);
if (files.length != 0) {
loadFiles(files)
.then((fileContents) => {
console.log(fileContents); // 在所有文件加载完成后,打印包含所有文件内容的数组
fileContents.forEach(f => {
let imgEl = document.createElement('img')
imgEl.src = f
imgEl.style.width = '100px'
imgEl.style.height = '200px'
document.body.appendChild(imgEl)
})
})
.catch((error) => {
console.error(error); // 处理错误情况
});
}
})
function loadFiles(files) {
const promises = []
for (const item of files) {
promises.push(readFile(item))
}
return Promise.all(promises);
}
// 利用 promise 封装一个生成 base64的 函数,因为 onload 事件不是同步的,它需要事件处理
function readFile(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = (event) => {
const result = reader.result;
if (typeof result === 'string') {
resolve(result);
} else {
reject(new Error("Failed to read file"));
}
};
reader.onerror = (event) => {
reject(event.target.error);
};
// 参数file: 从中读取的 Blob 或 File 对象
reader.readAsDataURL(file);
});
}
</script>
</body>
</html>
3、window.URL.createObjectURL
window.URL.createObjectURL 方法 返回一个 url,可以直接放在 img 的src 属性上,也可以直接放在浏览器打开
<!DOCTYPE html>
<html lang="en">code>
<head>
<meta charset="UTF-8">code>
<meta name="viewport" content="width=device-width, initial-scale=1.0">code>
<title>Document</title>
</head>
<body>
<input id="file2" type="file" value="createObjectURL 方式" multiple>code>
<script>
let file2El = document.querySelector('#file2')
file2El.onchange = function () {
let files = file2El.files
for (const item of files) {
// 接收 File、Blob 或 MediaSource 对象。
let url = window.URL.createObjectURL(item)
console.log('url', url);
let img = document.createElement('img')
// createObjectURL 返回的格式比如:blob: http://127.0.0.1:5500/3c9e3502-1c0c-4dae-b4dc-26b68f207285
img.src = url
document.body.appendChild(img)
}
}
</script>
</body>
</html>
4、参考链接
createObjectURL MDNFileReader MDN
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。