點燈坊

失くすものさえない今が強くなるチャンスよ

如何將 Binary 轉成 Base64 String ?

Sam Xiao's Avatar 2020-04-21

一般 API 對於圖片都會回傳 Base64 String,若 API 是回傳 Binary 呢 ? 此時我們就得自行 Encode 成 Base64 String 在才能顯示圖片。

Version

macOS Catalina 10.15.4
WebStorm 2020.1
Vue 2.6.11
Axios 0.19.2

Fake Image

<template>
  <img src="https://fakeimg.pl/300x250/">
</template>

<script>
export default {
  name: 'App'
}
</script>

<img>src 可直接指定由 Fake Image 產生圖片。

base64000

Base64

<template>
  <img :src="myImage">
</template>

<script>
import axios from 'axios'

let fetchImage = () =>
  axios.get('https://fakeimg.pl/300x250/', {
    responseType: 'arraybuffer'
  })

let mounted = function() {
  fetchImage()
    .then(x => {
      let prefix = 'data:' + x.headers['content-type'] + ';base64,'
      let content = Buffer.from(x.data, 'binary').toString('base64')

      return prefix + content
    })
    .then(x => this.myImage = x)
}

export default {
  name: 'App',
  data: () => ({
    myImage: ''
  }),
  mounted
}
</script>

我們仍然以 'https://fakeimg.pl/300x250/' 為例,但這次改由 Axios 透過 GET 讀取圖片,並自行轉成 Base64 String。

第 1 行

<template>
  <img :src="myImage">
</template>

src 改 binding 到 myImage data。

第 8 行

let fetchImage = () =>
  axios.get('https://fakeimg.pl/300x250/', {
    responseType: 'arraybuffer'
  })

GET 讀取圖片,在 config 要加上 responseType: 'arraybuffer'

13 行

let mounted = function() {
  fetchImage()
    .then(x => {
      let prefix = 'data:' + x.headers['content-type'] + ';base64,'
      let content = Buffer.from(x.data, 'binary').toString('base64')

      return prefix + content
    })
    .then(x => this.myImage = x)
}

mounted hook 內呼叫 fetchImage() 讀取圖片。

let prefix = 'data:' + x.headers['content-type'] + ';base64,'

自行組合 Base64 的 prefix 部分。

let content = Buffer.from(x.data, 'binary').toString('base64')

return prefix + content

將圖片轉成 Base64 String,最後相加。

.then(x => this.myImage = x)

將 Base64 String 寫入 myImage side effect。

base64001

Conclusion

  • 這是個制式寫法,可將 API 回傳的圖片轉成 Base64 String 後,再以 data binding 方式對 src 綁定即可