Blob, FileReader, URL.createObjectUrl()

154 阅读1分钟

本地预览图片(无需上传到后端返回url)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input type="file" id="fileInput">
<img id="preview" src="">
<script>
    const fileInput = document.getElementById("fileInput")
    console.log(fileInput)
    fileInput.addEventListener("change", function (event) {
        const file = event.target.files[0] //类型为File对象
        const fileUrl = URL.createObjectURL(file) //类型为string。blob:http://localhost:63342/e368955d-79e0-4d2e-b635-5c454a683581
        document.getElementById("preview").src = fileUrl
        console.log("file", event, file, fileUrl)
    })
</script>
</body>
</html>

页面销毁时候记得销毁 URL.revokeObjectURL(fileUrl) //释放内存

image.png

image.png

转成base64后渲染图片

// 转换为base64编码
const imgEl = document.querySelector(".img")
const fileReadBase64 = new FileReader()
document.getElementById("fileInput").addEventListener("change", function (event) {
    const file = event.target.files[0] //类型为File对象
    fileReadBase64.readAsDataURL(file) // 转换为base64编码
})
fileReadBase64.onload = function (e) {
    imgEl.src = fileReadBase64.result
}

image.png

//readAsArrayBuffer 转换为ArrayBuffer对象
const fileReadBuffer = new FileReader()
fileReadBuffer.readAsArrayBuffer(blob)
fileReadBuffer.onload = function (e) {
    console.log("this.result", this.result)
}

// 下载图片URL.createObjectURL()下载图片,会常见一个Blob URL可用于img.src做为展示,也能做为二进制数据下载链接
const aEl = document.querySelector(".download")
fileInput.onchange = function (event) {
    const file = this.files[0];
    aEl.download = file.name //下载文件名
    aEl.href = URL.createObjectURL(file) //下载链接
}