buffer文件流转化成图片(base64)的url地址

10,345 阅读2分钟

这次的项目做到一个功能:第三方用户跳转到平台需要根据用户的id动态生成小程序码,达到扫描二维码免登录的效果,而后台给的小程序码是文件流而不是url地址,那么就需要前端去转换一下这两者

先贴下具体转换代码

js

function transformArrayBufferToBase64 (buffer) {            
    var binary = '';            
    var bytes = new Uint8Array(buffer);            
    for (var len = bytes.byteLength, i = 0; i < len; i++) {                
        binary += String.fromCharCode(bytes[i]);            
    }            
    return window.btoa(binary);        
}    
let dataStr =  transformArrayBufferToBase64(res)
this.qrcodeImg = "data:image/png;base64," + dataStr;

html

<img :src="qrcodeImg" alt="">

注意点:

使用ajax时需要将responseType设置为arraybuffer才能被识别,这点很重要!


以下是本项目的实际应用,感兴趣的可以继续往下看,赶时间的直接复制上面那行代码并且看清注意事项就OK了~


首先,在封装的axios中定义一个get方法,该方法的responseType为arraybuffer(buffer转base64或者下载excel文件流的时候都可以用)

getBuffer(url, urlData, data = 0) {      
    let oUrl=url;    
    // 创建一个promise对象    
    this.promise = new Promise((resolve, reject) => {      
        if (data == 0) {        
            url += '?';        
            for (const item in urlData) {          
                url += item + '=' + urlData[item] + '&';        
            };      
        } else if (data == 1) {        
            for (const item in urlData) {          
                url += '/' + urlData[item];        
            };      
        }      
        axios.get(url, {        
            responseType: 'arraybuffer'      
        }).then((res) => {        
            this.countlyMonitorResponse(oUrl, 'get', res.data.code);        
            if (this._isStatus(res.data)) {          
                resolve(res.data);        
            }      
        }).catch((err) => {        
            console.log(err)      
        })    
    })    
    return this.promise;  
};


其次,定义一个混入对象用于转换buffer为base64,使用mixins为了之后可在多个页面中复用

qrcodeMixins.js

export default {  
    data() {    
        return {      
            qrcodeImg: '',    
        }  
    },  
    mounted() {    
        this.reqQrcode()  
    },  
    methods: {    
        reqQrcode() {      
            let params = {        
                userId: this.$store.state.userId.userId,        
                userName: this.$store.state.userId.userName,        
                gender: 1,        
                hasBind: true,      
            }      
            this.$ajax.getBuffer('/extra/user/getUserPic', params).then(res => {        
                function transformArrayBufferToBase64 (buffer) {            
                    var binary = '';            
                    var bytes = new Uint8Array(buffer);            
                    for (var len = bytes.byteLength, i = 0; i < len; i++) {                
                        binary += String.fromCharCode(bytes[i]);            
                    }            
                    return window.btoa(binary);        
                }        
                let dataStr =  transformArrayBufferToBase64(res)        
                this.qrcodeImg = "data:image/png;base64," + dataStr;      
            })    
        },  
    },
}


最后,在需要的页面引入minxin,并且将图片的src地址改为qrcodeImg

<template>  
    <div class="introduce">    
        <img :src="qrcodeImg" alt="">  
    </div>
</template>
<script>
    import qrcodeMixin from './qrcodeMixin'
    export default {  
        name: 'introduce_pc',  
        mixins: [qrcodeMixin],  
        data() {    
            return {    }  
        },  
        methods: {      
        }
    }
</script>