JavaScriptを利用してファイルをアップロードする - HTMLHttpRequestを利用したファイルのアップロード - JavaScript

JavaScriptを利用してファイルをアップロードするコードを紹介します。

概要

JavaScriptでファイルをアップロードする方法には何種類かありますが、この記事ではHTMLHttpRequestを利用してファイルのアップロードをするコードを紹介します。なお、フォームのPostを実行してファイルをアップロードする場合は、JavaScriptからフォームのポストを実行するこちらの記事のコードを参照してください。また、HTML5のFileAPI/Fileオブジェクトを利用したファイルのアップロードについてはこちらの記事を参照してください。

プログラム

コード

Form03.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
	<meta charset="utf-8" />
  <script type="text/javascript">
    function ExecUpload() {
      var formObj = document.getElementById("form1")
      var data = new FormData(formObj);

      var xmlhttp = new XMLHttpRequest();
      xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
          alert(xmlhttp.responseText);
        }
      };
      xmlhttp.open("POST", "GetForm03.ashx", true);
      xmlhttp.send(data);
    }
  </script>
</head>
<body>
  <form id="form1">
    <div>File-01<input name="File01" type="file" /></div>
    <a href="javascript:void(0);" onclick="ExecUpload();">アップロード</a>
  </form>
</body>
</html>

ポストされたファイルを受け取る側の実装です。今回はC#のジェネリックハンドラで実装しています。
GetForm03.ashx
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace FormFileAccept
{
  /// <summary>
  /// GetForm03 の概要の説明です
  /// </summary>
  public class GetForm03 : IHttpHandler
  {

    public void ProcessRequest(HttpContext context)
    {
      if (context.Request.HttpMethod == "GET") {
        context.Response.ContentType = "text/plain";
        context.Response.Write("OK+");
      }
      else if (context.Request.HttpMethod == "POST") {
        HttpPostedFile file01 = context.Request.Files["File01"];

        string phyPath = context.Server.MapPath("/");
        file01.SaveAs(phyPath + System.IO.Path.GetFileName(file01.FileName));

        context.Response.ContentType = "text/plain";
        context.Response.Write("OK");
      }
    }

    public bool IsReusable
    {
      get
      {
        return false;
      }
    }
  }
}

解説

ページ内の[アップロード]リンクがクリックされると、下記のExecUpload()関数を呼び出します。
function ExecUpload() {
  var formObj = document.getElementById("form1")
  var data = new FormData(formObj);

  var xmlhttp = new XMLHttpRequest();
  xmlhttp.onreadystatechange = function () {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
      alert(xmlhttp.responseText);
    }
  };
  xmlhttp.open("POST", "GetForm03.ashx", true);
  xmlhttp.send(data);
}

下記コードで、フォームのIDを与えてgetElementById()メソッドを呼び出し、フォームの要素のおぶえj区とを取得します。
  var formObj = document.getElementById("form1")

FormDataオブジェクトを作成します。コンストラクタの引数に フォームの要素のオブジェクトを与えることで、与えたフォームのFormDataオブジェクトを作成できます。
  var data = new FormData(formObj);

下記コードで、XMLHttpRequestオブジェクトを作成し、POSTでデータを送信します。送信するデータは、XMLHttpRequestオブジェクトのsend()メソッドの第一引数に与えます。今回の例では、先に作成した、FormDataオブジェクトを与えます。送信の完了処理はXMLHttpRequestオブジェクトのonreadystatechange イベントに実装します。今回の実装では、アラートダイアログを表示し、サーバーからのレスポンスデータをダイアログに表示します。
  var xmlhttp = new XMLHttpRequest();
  xmlhttp.onreadystatechange = function () {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
      alert(xmlhttp.responseText);
    }
  };
  xmlhttp.open("POST", "GetForm03.ashx", true);
  xmlhttp.send(data);

サーバー側のジェネリックハンドラーについてはこちらの記事の解説を参考にしてください。

実行結果

プロジェクトを実行し、Form03.html ファイルを開きます。下図の画面が表示されます。


ファイル参照ボックスの[参照]ボタンをクリックします。[アップロードするファイルの選択]ダイアログボックス(ファイルを開くダイアログ)が表示されます。アップロードするファイルを選択します。


ファイルを選択しました。


今回アップロードするファイルは下図のテキストファイルです。


HTML画面の[アップロード]リンクをクリックします。正常にファイルがアップロードされると、下図の"OK"ダイアログが表示されます。


サーバーのHTMLファイルが配置されたディレクトリに、ファイルがアップロードされています。


ファイルの内容もアップロードしたファイルと一致しています。


このページのキーワード
  • JSを利用してファイルをアップロードする - HTMLHttpRequestを利用したファイルのアップロード
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2016-05-18
iPentec all rights reserverd.