前端,Blob/File实例对象或普通url转base64图片

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<input type="file" onchange="handleChange(this)">
<script>
    class ImageToBase64 {
        constructor() {
            this.imgReg = /^(?:image\/bmp|image\/cis-cod|image\/gif|image\/ief|image\/jpeg|image\/pipeg|image\/png|image\/svg\+xml|image\/tiff|image\/x-cmu-raster|image\/x-cmx|image\/x-icon|image\/x-portable-anymap|image\/x-portable-bitmap|image\/x-portable-graymap|image\/x-portable-pixmap|image\/x-rgb|image\/x-xbitmap|image\/x-xpixmap|image\/x-xwindowdump)$/i;
        }

        _getBase64(imgBlob) {
            return new Promise(resolve => {
                const fileReader = new FileReader()
                fileReader.onloadend = event => {
                    resolve(event.target.result)
                }
                fileReader.readAsDataURL(imgBlob)
            })
        }

        getResult(file) {
            return new Promise(async (resolve, reject) => {
                if (typeof file === "string") { // 如果是图片地址
                    // 判断是否是图片(正则百度的,可自由替换)
                    const xhr = new XMLHttpRequest()
                    xhr.open("GET", file)
                    xhr.responseType = "blob"
                    xhr.onload = async () => {
                        if (xhr.status === 200) { // 状态码正常
                            const imgBlob = xhr.response
                            if (this.imgReg.test(imgBlob.type)) { // 是图片类型
                                const result = await this._getBase64(imgBlob)
                                resolve(result)
                            } else {
                                reject({
                                    code: -1,
                                    msg: "type Error"
                                })
                            }
                        } else {
                            reject({
                                code: xhr.status,
                                msg: xhr.statusText
                            })
                        }
                    }
                    xhr.send()
                } else if (file instanceof Blob || file instanceof File) { // 如果是blob对象
                    const result = await this._getBase64(file)
                    resolve(result)
                } else {
                    throw new TypeError("expect a string or File instance object or Blob instance object," +
                        " but got others")
                }
            })
        }
    }

    function appendImage(url) {
        const oImg = new Image(100, 100)
        oImg.src = url
        document.body.appendChild(oImg)
    }

    const imageToBase64 = new ImageToBase64()

    // url转base64 测试
    !(async () => {
        const resultUrl = await imageToBase64.getResult("./images/1.jpg")
        appendImage(resultUrl)
    })()

    // Blob实例对象转base64 测试
    async function handleChange(e) {
        const [file] = e.files
        const resultUrl = await imageToBase64.getResult(file)
        appendImage(resultUrl)
    }
</script>
</body>
</html>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript中的BlobFileBase64都是处理文件或数据的常用对象。下面将介绍它们的使用场景以及相互之间的换。 Blob对象用于表示不能被修改的类文件数据,并且可以在被发送到服务器之前进行处理。它可用于在网页上生成和下载文件,比如将网页上的图片存储为Blob对象,然后使用URL.createObjectURL()方法将其显示为图像。此外,Blob对象也可以用于通过XMLHttpRequest或Fetch API将数据发送到服务器。 File对象继承自Blob对象,它是用户在表单中选择的文件的表示形式。File对象可以包含文件的名称、大小、类型以及最后修改日期等信息。在上传文件时,我们通常会使用File对象来获取文件的详细信息并进行验证。 Base64是一种将二进制数据编码为ASCII字符的方式,常用于在文本传输中表示二进制数据。我们可以使用JavaScript的btoa()和atob()函数在Base64字符串和二进制数据之间进行相互换。 在相互换方面,可以将Blob对象换为Base64字符串,然后使用toDataURL()方法将其换为DataURL,或者使用FileReader对象的readAsDataURL()方法将BlobFile对象换为DataURL。而将Base64字符串换为Blob对象,则可以使用Blob构造函数并设置正确的MIME类型。 综上所述,Blob对象适用于处理类文件数据和发送到服务器,File对象适用于处理用户上传的文件,而Base64适用于在文本传输中表示二进制数据。根据具体的应用场景和需求,我们可以进行这三种对象之间的相互换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值