XMLHttpRequestを使ったファイルアップロード
XMLHttpRequestを使ったファイルアップロードを試してみます。
HTML側のファイル参照ボタンは
<input type="file" name="file1">
のように書くものとします。
(場合により、このファイル参照用ボタンにはidやclassを指定して使います)
また、XMLHttpRequestには仕様策定のバージョンがあり、XMLHttpRequest の Level2 の
sendメソッドを使用するとファイルのアップロードができます。
ユーザがブラウザから
<input type="file" name="file1">
を使って選択したデータにはファイル情報が格納されます。
具体的には、参照ボタンからファイルを選択した結果としてFileListオブジェクトを取得し、
また、ドラッグ&ドロップ操作時にはDataTransferオブジェクトのfilesプロパティを使って取得できます。
通常のHTML+php等でファイルアップロードをする場合は、
formに「 enctype=”multipart/form-data”」の属性を記述しますが、
今回試したサンプルでは、上記の属性を記述していません。
簡単なサンプルを書いて試してみます。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>テストHTML</title> </head> <body> <form id="testform"> <div> <input type="file" name="file1" id="file1"> </div> <div> <input type="button" id="sample_file_upload" value="ファイルアップロードのテスト"> </div> </form> <div>通信時の処理内容</div> <div id="ajax_result"></div> <script type="text/javascript"> // ファイルアップロードボタンのDOMを取得 let element_sample_file_upload = document.getElementById('sample_file_upload'); // イベントを付与 element_sample_file_upload.addEventListener('click', SendXMLHttpRequest, false); // ボタン押下時の処理 function SendXMLHttpRequest() { // 通信処理を画面に出力する為、操作用DOMの取得 let result = document.getElementById("ajax_result"); result.innerHTML += 'ファイルアップロードのテスト start' + '<br />'; result.innerHTML += '通信処理の開始' + '<br />'; // フォーム内容の取得 let testform_data = document.getElementById("testform"); // 送信用データ let form_data = new FormData(testform_data); // 通信用XMLHttpRequestを生成 let req = new XMLHttpRequest(); // POST形式でサーバ側の「response.php」へデータ通信を行う req.open("POST", "response.php"); // ファイルが選択されたときに処理を実行するようイベントリスナーに登録 input_file = document.getElementById("file1"); input_file.addEventListener('change', function(e) { form_data.append('file1', e.target.files[0]); }); // ファイル送信 req.send(form_data); // 通信が完了したらレスポンスをコンソールに出力する req.addEventListener('readystatechange', () => { // ここでレスポンス結果を制御する console.log("レスポンス結果"); }); result.innerHTML += '通信処理の終了' + '<br />'; result.innerHTML += 'レファイルアップロードのテスト end' + '<br />'; } </script> </body> </html>
このように書くことで、選択したファイルをサーバ側へ送信することができます。
ファイルをアップロード後のサーバサイドでは、ファイルを受信するプログラムを用意します。
言語はなんでもいいのですが、上記のサンプルを動作させる為にphpで下記のように書きました。
<?php // ファイルのアップロード処理 if (is_uploaded_file($_FILES["file1"]["tmp_name"])) { if (move_uploaded_file($_FILES["file1"]["tmp_name"], "./datas/" . $_FILES["file1"]["name"])) { chmod($_FILES["file1"]["name"], 0644); $ret = true; $message = $_FILES["file1"]["name"] . "をアップロードしました。"; } else { $ret = false; $message = "ファイルをアップロードできません。"; } } else { $ret = false; $message = "ファイルが選択されていません。"; } // 処理結果をjson形式用の形にまとめる $json_value = array( "ret" => $ret, "message" => $message ); // ヘッダーの指定と返却値をjsonで返す header("Content-Type: application/json; charset=UTF-8"); header("X-Content-Type-Options: nosniff"); echo json_encode($json_value, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP); ?>
実際に試してみると、選択したファイルがサーバにアップロードされることがわかります。
また、ファイルアップロード後のレスポンス結果を処理する部分は、何も処理を書いていません。
javascriptのXMLHttpRequestを使ってファイルを送信する方法を試した程度なので、
実際の開発では、レスポンス結果を制御して実装する必要があります。