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
ってのがあるので、ここで処理を書いても良さそう?(未検証)
transformRequest
allows 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 で、初期値の設定と選択状態のクリア