axios で添付ファイルありのリクエスト(multipart/form-data の POST)
はじめに
axios で、添付ファイルありのリクエストを送信する方法を整理した。
【React】axiosを使用してmultipart/form-data形式の通信をする - モノクロタイム を参考にさせてもらった。
TL;DR
FormDataのappendでデータを構築- Request Config の
transformRequestでも対応できるかも?(未検証) FormDataはブラウザのみなので、CLI ツールなどは別フォーマットを使う必要がありそう
目次
環境・条件
1 | $ sw_vers |
詳細
【React】axiosを使用してmultipart/form-data形式の通信をする - モノクロタイム に記載の通り、FormData を使ってリクエストすると良い。
NG
data 部分を単なるオブジェクトにすると失敗する。(というか、うまくファイルを送信できない)
※例外処理とかは省略。
1 | const postAvator = async (image: File) => { |
OK
data 部分を FormData にして、append でリクエストパラメータを追加する。
1 | const postAvator = async (image: File) => { |
何が違うのか?
Chrome の DevTools で確認した際の違い。
Content-Type
NG ケースは multipart/form-data のみ。
OK ケースは multipart/form-data; boundary=----xxxx になる。
具体的には、検証時は multipart/form-data; boundary=----WebKitFormBoundaryXXXX となっていた。
Payload(Form Data)
リクエスト時のパラメータも以下のように異なる。
NG ケースは、Request Payload として表示され、単なる JSON となっており、添付ファイル部分も空オブジェクト扱い。

OK ケースは、Form Data として表示され、添付ファイルがある箇所は (binary) の表記となる。

まとめ
FormDataのappendでデータを構築- Request Config の
transformRequestでも対応できるかも?(未検証) FormDataはブラウザのみなので、CLI ツールなどは別フォーマットを使う必要がありそう
その他・メモ
transformRequest について
Request Config - axios/axios を見ると transformRequest ってのがあるので、ここで処理を書いても良さそう?(未検証)
transformRequestallows changes to the request data before it is sent to the server
This is only applicable for request methods ‘PUT’, ‘POST’, ‘PATCH’ and ‘DELETE’
The last function in the array must return a string or an instance of Buffer, ArrayBuffer,
FormData or Stream
You may modify the headers object.
1 | transformRequest: [function (data, headers) { |
FormData について
FormData はブラウザでのみ利用可能なので、CLI ツールなどの場合には別のフォーマットを使う必要がありそう。
以下記事内の方法でいけるかも。
Node.js + axios で 画像を mulitpart/form-data でアップロードしようとしてハマった話 - Qiita
参考文献
- 【React】axiosを使用してmultipart/form-data形式の通信をする - モノクロタイム
- Node.js + axios で 画像を mulitpart/form-data でアップロードしようとしてハマった話 - Qiita
- axios/axios: Promise based HTTP client for the browser and node.js
- FormData - Web API | MDN
- FormData.append() - Web API | MDN
関連記事
- axios で unable to verify the first certificate の対応方法
- ブラウザで Node.js の Buffer を使う(CDN)
- Vue.js を使ってメインページ側で動作する Chrome 拡張機能を開発する方法
- Cordova iOS axios で Network Error となる場合の回避策
- webpack で Moment.js の不要な Locale を除去
- webpack & Babel を使って Chrome 拡張機能を開発するためのテンプレート(Hot Reload 付き)
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア