Ajaxによるデータ送信
最近業務でajaxについて調べていたのですが、古い情報がわんさか出てきていろいろと惑わされ苦労したので、保存用にまとめておきます。
$('#export_btn').on('click', function(event){ // 通常のアクションをキャンセルする event.preventDefault(); var import_data=new FormData(this); import_data.append('filedata', $('input[type=file]')[0].files[0]); import_data.append('filename', $('#filename').val()); $.ajax({ url: '/data/import_csv', // Formのアクションを取得して指定する type: 'post', // Formのメソッドを取得して指定する data: import_data, contentType: false, processData: false, }).done(function (res) {
関数のイベントはクリックでもSUBMITでもどっちを指定してもいいです。buttonは何も指定していないと自動でSUBMITになるので、event.preventDefault();
でSUBMIT処理を無効化しておかないと通信がうまくいきません。
・テキストデータを送るとき
// 通常のアクションをキャンセルする event.preventDefault(); var $form= $('#export_form'); var query= $form.serialize(); var flag = 0; var form2 = document.forms.export; var start_date = toDate(form2.start.value, '/'); var end_date = toDate(form2.end.value, '/'); // 入力必須項目が入力されているかチェック、不適切な場合は各エラーコードとそれに対応したエラーメッセージを返す //入力日時が出力日時よりもあとならばエラー2を返す if (end_date.getTime() < start_date.getTime()) { flag = 2; } //入力日時と出力日時が90日以上離れている場合はエラーログ3を返す if (((end_date.getTime() - start_date.getTime()) / 86400000) >= 90) { flag = 3; } //入力フォームに空欄がある場合はエラーログ1を返す if (document.export.start.value == "") { flag = 1; } if (document.export.end.value == "") { flag = 1; } if (document.export.choise_pattern.value == "") { flag = 1; } if (flag == 1) { // 入力必須項目に未入力があった場合 window.alert('必須項目は全て入力して下さい。'); // アラートを表示 return false; // 送信中止 } if (flag == 2) { // 入力必須項目に未入力があった場合 window.alert('エクスポート期間の指定が不適切です。もう一度確認してください'); // アラートを表示 return false; // 送信中止 } if (flag == 3) { // 入力必須項目に未入力があった場合 window.alert('エクスポート期間が90日以上になっています。'); // アラートを表示 return false; // 送信中止 } else { // 入力必須項目が全て入力済みだった場合 $.ajax({ url: '/data/export_csv', // Formのアクションを取得して指定する type: 'get', // Formのメソッドを取得して指定する data: $form.serializeArray(), // データにFormがserialzeした結果を入れる }).done(function(response){ window.location.href = "/export_action?path="+response; }).fail(function(){ console.log(query); });} }); </script>
テキストデータの送信
serialize()
で直列化する必要があります。うまくいかないときはserializeArray()を試してみるのもありかもしれません
画像とかZIPを送るとき
ajaxで画像やファイル系のものをアップロードする通信を実装するにあたっての肝はFormDataをあらかじめ作ってあげる必要があるという点ですね。
テキストデータを送信する場合は必要ないのですが、ファイル形式のものをAJAXを通してアップロードするとなるとこのようにする必要があります。
AJAXでのファイル送信は基本的にこのFORMDATAにアップロードしたいファイルをappendしてオブジェクト方式で送信するという流れになります。
あとtypeはpostにしておかないとだめでGETではちゃんとデータが送れないので注意してください。そして、引数のcontentType: false
,とprocessData: false,
も忘れないでください。つけておかないと上手く送信できません。
サーバー側での受け取り方は普通の通信の時と同じです。(少なくともBottleとFLASKはそうでした).done以降には通信に成功した際の処理を記述していきます。このコードだとresの部分にサーバー側からのレスポンスが帰ってきています。
ストリーミングでファイルをダウンロードする的な処理はできないので、AJAX通信でダウンロード用URLを返して、.done以降の処理でwindow.location.href =
なんかでそのURLにアクセスして発火させるという感じの処理になります。
コメント