2022年3月9日水曜日

jQuery を使ってファイルをアップロードする方法

jQuery を使ってファイルをアップロードする方法

概要

前回はライブラリを使った方法を紹介しました
今回は jQuery のみを使ってファイルをアップロードする方法を紹介します

環境

  • macOS 11.6.4
  • Ruby 3.0.3p157
  • sinatra 2.2.0

サーバ側実装

サーバ側のコードは前回と同じです

クライアント側実装

  • vim views/index.erb
<!DOCTYPE HTML>
<html>
  <head>
  <meta charset="utf-8">
  <title>Upload Test</title>
  </head>
<body>
<input id="upload_file" type="file" name="file">
<button id="upload" type="button">Upload</button>
<div id="result"></div>
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script>
$(function () {
  $('#upload').click(function() {
    let fd = new FormData();
    fd.append("file", $('#upload_file').prop('files')[0]);
    $.ajax({
      url:'/upload',
      type:'post',
      data: fd,
      processData: false,
      contentType: false,
      cache: false,
    }).done(function (data) {
      $('#result').text("uploaded.")
    }).fail(function() {
      $('#result').text("upload failed.")
    });
  });
});
</script>
</body> 
</html>

少し解説

jQuery でファイルを送信するには FormData + ajax を使います
ファイルは複数指定されることを想定していますが今回は1ファイルのみ指定可能にしているので先頭のファイルのみを送信します ($('#upload_file').prop('files')[0])

prop のあとの files は必ず「files」でなければなりません

あとはサーバ側でファイルを保存すれば OK です

最後に

ライブラリを使うとプログレスバーやアップロード後のコールバックメソッドが予め定義されているので便利なのは便利なのですが使わない機能もあります

本当に簡単なフォームを作成したいだけだればこれくらいでもいいかもしれません

参考サイト

0 件のコメント:

コメントを投稿