【Vue.js + axios + FastAPI】arraybufferの扱い
もう流石に大丈夫(だと思うの)だけど、画像処理APIを開発中当時、ハマった話。
フロントのフレームワークにVue.jsを用いた際、axiosでapi(バックのフレームワークはFastAPIを使用)を叩いてarraybufferを変えさせようとしたけど全然上手くいかなかった。
axiosでリクエストを送る際に、axiosインスタンスを下記のように生成するのだけれど、、、
let axiosInstance = axios.create({
// requestのデータ形式をヘッダーとして指定しておく
// 'headers': {'Content-Type': 'application/json',}
'headers': {'Content-Type': 'multipart/formdata'}
})
上の形だと、API側からbytesのデータを返そうとすると、上手くいかない。
結論から言うと単純な話、
let axiosInstance = axios.create({
'responseType': 'arraybuffer', // ここでレスポンスのデータタイプにarraybufferを指定しておく
'headers': {'Content-Type': 'multipart/formdata'}
})
上記のように'responseType'を指定してやる、とFastAPIのreturn Response(content=bytesData) で返されたpythonのbytes型などのデータがVue.js(つまりはjs)側でarraybufferとして受け取れる。
個人的注意点
画像処理でフロント側で、DataURLやbase64m文字列などを直接受け取りたい場合は、responseTypeにarraybufferを指定していると、文字列としてではなく、バイナリデータとして受け取ってしまうので、文字化けしてしまって、期待した形のデータを受け取れないため注意
補足(あるいは個人的メモ)
どこか別の記事でやるつもりだけど・・・
imgタグのsrc属性にURLで画像を埋め込んだりしたいときに、blobURLを生成したいと思うけど、blobURLはフロント(jsによるDOM)上でないと生成できない。フロントにあまり処理を持たせたくない時は、あらかじめbase64文字列などから作成したDataURLをAPIからレスポンスして、それを直接埋め込む、と言う手法で代替できる。