JavaScript

最終更新日:
公開日:

レシピ

Ajax

Fetch APIから画像ファイルをJSON形式で送信する

画像ファイル(PNG、JPEG、GIF)をBase64形式に変換して、Fetch APIからJSON形式のデータとしてサーバーへ送信する方法について解説します。

この記事のポイント

  • 画像ファイルはBase64形式に変換してJSON形式のデータにする
  • 画像ファイルをテキストと同様の扱いで送受信できる

Fetch APIのAjaxを使って画像をJSON形式で送信する

Fetch APIから画像ファイルを送信するときはForm Dataオブジェクトにファイルをセットして送信する方法がありますが、Base64形式に変換してJSON形式のデータとして送信することも可能です。
この方法を使うと、画像ファイルをテキスト形式にしてサーバーと受け渡しができるようになるため扱いが便利になります。

今回は画像ファイル(PNG、JPEG、GIF)を対象としていますが、画像以外の形式のファイルも送信可能です。

以下の例では、フォームのファイル選択から画像を選択するとFileReaderオブジェクトによってファイルの読み込みを開始します。
その後、読み込んだファイルをJSON形式のデータにまとめて、Fetch APIから送信します。

まずは今回使用するページのHTMLコードから紹介していきます。

HTML コード例

<form method="post" action="" enctype="multipart/form-data">
	<input type="file" id="upload_file" name="upload_file">
</form>
<p>アップロードしたファイルをここに表示:</p>
<div id="file_area"></div>

id属性upload_file」を持つinput要素でファイルを選択したときに、Fetch APIでファイルを送信するように設定していきます。
また、レスポンスデータからJSON形式のデータを読み込み、id属性file_area」を持つdiv要素に画像を挿入します。

続いて、JavaSriptのコードを紹介します。
大まかな流れはコメント中の(1)〜(5)の順番です。

JS コード例

window.addEventListener('DOMContentLoaded', function(){

	document.getElementById("upload_file").addEventListener('change', function(e){

		// (1)選択したファイルを読み込み
		let file_reader = new FileReader();
		file_reader.readAsDataURL(e.target.files[0]);

		// (2)ファイルの読み込みが完了したら実行
		file_reader.addEventListener('load', function(e) {

			// (3)JSONにするデータを作成(この時点ではObject形式)
			let data = {
				"title": "Bear",
				"image": e.target.result,
				"post_date": "2021-04-01"
			};

			// (4)Fetch APIによるデータ送信
			fetch('/test.php', { // 送信先
				method: 'post', // メソッド
				headers: { // ヘッダー指定
					'Content-Type': 'application/json'
				},
				body: JSON.stringify(data) // 送信データをセット(ここでJSON形式に変換)
			})
			.then(response => response.json())
			.then(data => {

				// (5)レスポンスデータ(JSON形式)からページに挿入
				const file_area = document.getElementById('file_area');
				const img_element = document.createElement('img');
				img_element.src = data.image;
				file_area.append(img_element);
			});

		});

	});

});

JavaScriptコードで実行する処理の流れを詳しく解説していきます。

まず、ページが読み込まれたタイミング(DOMContentLoaded)で、フォームのファイル選択する要素「<input type="file" id="upload_file" name="upload_file">」にイベントリスナーを設定します。
ここではイベント「change」をトリガーにしていますが、これはファイルが選択された状態になったときに発生します。

ファイルが選択されるとイベントリスナーの内側の処理が実行されていきます。

(1)ではFileReaderオブジェクトを作成し、続いてすぐにreadAsDataURLメソッドから選択したファイルをBase64形式で取得します。
選択したファイル自体はe.target.filesプロパティから参照することができます。

(1)のファイル読み込みが完了すると、(2)のイベントリスナー「load」が呼び出されて実行されます。

(2)の内側ではまず送信するデータをオブジェクト形式で用意します。
ここで選択した画像ファイルもオブジェクトのimageプロパティにこのデータは後ほどJSON形式のデータに変換します。

(4)はFetch APIによるデータ送信です。
メソッド、ヘッダー、送信データを送信先のURLに送信します。
先ほどオブジェクト形式で作ったデータは、ここでJSON.stringifyメソッドを使ってJSON形式に変換してbodyにセットします。

レスポンスデータから取得したJSON形式のデータは、(5)でimg要素のsrc属性に設定して、さらにid属性file_area」のdiv要素に挿入して表示します。

以上が一連の流れになります。
また、今回は送信先を「test.php」としていますが、PHP側では受け取ったJSON形式のデータをhtmlspecialchars関数でサニタイズだけして、そのまま返すだけの処理を実行しています。

PHP コード例

<?php

$data = json_decode(file_get_contents('php://input'), true);
$clean = array();

if( $data ) {
	foreach( $data as $key => $value ) {
		$clean[$key] = htmlspecialchars( $value, ENT_QUOTES);
	}
};

echo json_encode($data);
return;

以上が、画像ファイルをJSON形式のデータとして送信する方法でした。