Ajaxを用いたドラッグ&ドロップによるファイルアップロード

Copyright(C) 28Dec2014 coskx TNCT

1.ドラッグ&ドロップによるファイルアップロード


HTML5の機能を用いて<input type="file" ...>を使用したフォームでは,複数ファイルのアップロードができるようになったが,ブラウザによりドラッグ&ドロップができたりできなかったりで,ユーザが迷ってしまう。
jQuery(javascriptの拡張ライブラリ)を用いるとブラウザによる違いをかなり排除できるようになる。
ブラウザの機能の助けを借りて,かなり自由に動作を記述できるようになるからである。

デモphpファイル

デモページではjquery-2.1.3.min.jsを必要とし,(バージョンによる動作の違いがあるかもしれないのでバージョンまで指定)それがサーバのドキュメントルート内のディレクトリjquery中に置いてあるものとする。
例えばドキュメントルートがc:\apache2.2\htpdocなら次のところに置く。
c:\apache2.2\htpdoc\jquery/jquery-2.1.3.min.js
これはphpファイル中の
<script type="text/javascript" src="/jquery/jquery-2.1.3.min.js"></script>
に書いてあることに対応している。

もし,phpファイルに
<script type="text/javascript" src="/js/jquery-2.1.10.min.js"></script>
と書いてあるなら,(jqueryのバージョンが2.1.10になったことを想定)
c:\apache2.2\htpdoc\js/jquery-2.1.10.min.js
のように置けば良い。
jqueryはネット検索で見つけてダウンロードすればよい。 https://code.jquery.com/jquery/

追記
インターネット回線が高速になっており,キャッシュメモリも大きくなっているため,ページ表示の時に,jqueryを元のサイトから読み出す方が手間がなくなっていて,主流になっている。
次のように記述するとよい。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>


ここでは5つの例をあげて,紹介する。「デモphpファイル」中には,ここで取り上げないファイルも含まれている。(readme.txtに説明がある)

(1)単一ファイルを選択し,即時にアップロード
(2)複数ファイルを選択し,即時にアップロード
(3)複数ファイルを選択後,送信ボタンによりアップロード
(4)複数ファイルを選択後,送信ボタンによりアップロード(見た目を修正)
(5)複数ファイルを選択後,送信ボタンによりアップロード(進捗表示付き)

なお,jqueryとAjaxによる非同期通信について利用例を次に示す。 Link

2.単一ファイルを選択し,即時にアップロード


2.1 非同期通信でWebサーバからの受信メッセージを表示


<input type="file" ...>を用いるが,ユーザがファイルを選択すると,状態が変化するので,これにより,即座にファイルのアップロードが開始される。また,ドロップエリア にファイルがドロップされるとこれによっても即座にファイルのアップロードが開始される。
ファイルのアップロードが終わったら,(Webサーバがファイルを受け取ったら,)そのままWebサーバからの返信を待つ。
受信側のPHPプログラムはファイルが送られてきたら,ファイルの受信を行う。Webサーバの文字コードセットがS-JISになっており,受信する文字コードはutf-8なので,PHPの受け取り部でファイル名をS-JISに変更してからファイル保存している。受信メッセージをブラウザ側に送信する。
Webサーバからの返信を待っていたブラウザは,受信メッセージを所定の<div>内に書き込む。
このことにより,ブラウザには受信メッセージが表示されることになる。
なお,Drag and Drop area(id="target")はdraggable="true" になっていて,ファイルのドラッグ&ドロップを受け付けるようになっている。
送信できるファイルは1つだけである。

送信側と受信側のキーになる共通のデータの名前は「tfile1」である。送信側で
fd.append("tfile1", files[0]);
となっているところが,formでの送信プログラムだったら
<form method="post" enctype="multipart/form-data">
<div>
<input id="FileUpload" type="file" name="tfile1"> 
</div>
<div><input type="submit" value="ファイル転送" /></div>
</form>
となっていることに対応している。例えばファイルを名前「tfile」で送信した場合の変数名は次のようになっている。

受信状態
$_FILES["tfiles"]["error"]
一時ファイル名
$_FILES["tfiles"]["tmp_name"]
送信元のファイル名
$_FILES["tfiles"]["name"]



List 2.1 単一ファイルを選択し,即時にアップロード fu.php ダウンロード
<?php
if( isset( $_FILES["tfile1"]["error"] ) ) {
    $UStatus = $_FILES["tfile1"]["error"];
    if( $UStatus === UPLOAD_ERR_OK ) {
        $tmp_name = $_FILES["tfile1"]["tmp_name"];
        $name     = $_FILES["tfile1"]["name"];
        mb_language("Japanese");
        $name1=mb_convert_encoding($name, "SJIS", "utf-8");
        move_uploaded_file( $tmp_name, "./$name1" );
        print "ファイル[ ".$name1." ]を受け取りました。";
        exit;
    }
}
?>

<html>
<head>
<script type="text/javascript" src="/jquery/jquery-2.1.3.min.js"></script>
<script>
$(function () {
    var uploadFiles = function (files) {
        // FormData オブジェクトを用意
        var fd = new FormData();

        // ファイル情報を追加する
        fd.append("tfile1", files[0]);

        // XHR で送信
        $.ajax({
            //url: "xxxx.php", //formではaction=に記述する名前,省略時は自分自身
            type: "POST",
            data: fd,
            processData: false,
            contentType: false,
            error: function(XMLHttpRequest, textStatus, errorThrown){
                err=XMLHttpRequest.status+"\n"+XMLHttpRequest.statusText;
                alert(err);
                //urlが不正など通信以上の場合は 404 not found などが表示される
                //urlが正しいが返信内容が不正の場合は 200 OK が返されるが
            },
            beforeSend: function(xhr){
                xhr.overrideMimeType("text/html;charset=Shift_JIS");
                //ajaxのテキスト受信がShift_JISであることを設定
                //作業が終わった時のデータの受信でSHIFT-JISが使われているため
                //utf8が使われていれば,この作業は不要
            }
        })
        .done(function( res ) {
            $("#report").html(res);
        });
    };

    // ファイル選択フォームからの入力
    $("#fileselect").bind("change", function () {
        // 選択されたファイル情報を取得
        var files = this.files;

        // アップロード処理
        uploadFiles(files);
        return false;
    });
   
    // ドラッグドロップからの入力
    $("#target").bind("drop", function (e) {
        // ドラッグされたファイル情報を取得
        var files = e.originalEvent.dataTransfer.files;

        // アップロード処理
        uploadFiles(files);
        // false を返してデフォルトの処理を実行しないようにする
        return false;
    })
    .bind("dragenter", function () {
        // false を返してデフォルトの処理を実行しないようにする
        return false;
    })
    .bind("dragover", function () {
        // false を返してデフォルトの処理を実行しないようにする
        return false;
    });
});
</script>
</head>
<body>
<h2>File Upload by Drag and Drop</h2>
<div id="report"></div>
file selecter<br>
<input id="fileselect" type="file" />
<br><br>
Drag and Drop area<br>
<div id="target" draggable="true"
    style="width:500px;background:#ffcccc;border:#ff0000 solid 1px;">
    <br />
    <div id="mylist">&nbsp;&nbsp;&nbsp;Drop File(s)</div>
    <br />
</div>
</body>
</html>
ページ表示の例
(これは表示の様子を示しているだけでこの表示からはどこにもアップロードされない)
本物では file selectのボタンからファイルを1つだけ選択すると直後にアップロードされる。
また,ファイルを1つだけdrag and Drop areaにドロップしても直後にアップロードされる。

File Upload by Drag and Drop

file selecter


Drag and Drop area

   Drop File(s)



Webサーバとブラウザとのデータ交換の流れ

ここに示した様に,Ajaxの非同期通信では,ファイルアップロード時に,
Webブラウザ側から新たなページの送信を求めずに,
必要最小限のメッセージのみ受け取るため,動作が単純となる。
Webブラウザの表示は新しい表示とはならず,受けといったメッセージを,
現在表示中のページの特定の領域に表示するだけとなる。

この特定の領域とは,htmlのbody中の
<div id="report"></div>
であり,最初は何も表示されていない。

ファイルアップロード終了時に,
.done(function( res ) {
    $("#report").html(res);
});
が,受け取ったresを <div id="report"></div> に表示している。

resを発信しているサーバ側の記述は,phpプログラムの
print "ファイル[ ".$name1." ]を受け取りました。";
である。

2.2 非同期通信であるが,直後にリロード


もともとAjaxは非同期通信なので,Webサーバから受信完了を示す受信メッセー ジだけを受け取り,List 1.1のように受け取ったメッセージだけを表示中のページ中に表示することができる。これは,通信量を減らし,再表示時間を短縮する仕組みである。ただ し,サーバ側の状態が刻々と変化し,その様子を同じWebページ内に表示するような時にはページのリロードが必要で,工夫が必要である。
次のfu_r.phpは,この非同期通信で返ってきた受信メッセージをhiddenでそのままWebサーバに送り返しながら(submit),受信メッセージ付きのWebページを要求し,ページの全再表示を行わせるものである。
この例では全再表示の必然性はないが,複数の項目が書き換わる場合は再表示の方が良い場合がある。

List 2.2 単一ファイルを選択し,即時にアップロード fu_r.php ダウンロード
<?php
if( isset( $_FILES["tfile1"]["error"] ) ) {
    $UStatus = $_FILES["tfile1"]["error"];
    if( $UStatus === UPLOAD_ERR_OK ) {
        $tmp_name = $_FILES["tfile1"]["tmp_name"];
        $name     = $_FILES["tfile1"]["name"];
        mb_language("Japanese");
        $name1=mb_convert_encoding($name, "SJIS", "utf-8");
        move_uploaded_file( $tmp_name, "./$name1" );
        $report="ファイル[ ".$name1." ]を受け取りました。";
        print $report; //受信メッセージの送信
        exit;
    }
}
$hiddenreply="";
if ( isset( $_POST["hiddenreply"] ) ) {
    $hiddenreply=$_POST["hiddenreply"];
}
?>

<html>
<head>
<script type="text/javascript" src="/jquery/jquery-2.1.3.min.js"></script>
<script>
$(function () {
    var uploadFiles = function (files) {
        // FormData オブジェクトを用意
        var fd = new FormData();

        // ファイル情報を追加する
        fd.append("tfile1", files[0]);

        // XHR で送信
        $.ajax({
            //url: "xxxx.php", //formではaction=に記述する名前,省略時は自分自身
            type: "POST",
            data: fd,
            processData: false,
            contentType: false,
            error: function(XMLHttpRequest, textStatus, errorThrown){
                err=XMLHttpRequest.status+"\n"+XMLHttpRequest.statusText;
                alert(err);
                //urlが不正など通信以上の場合は 404 not found などが表示される
                //urlが正しいが返信内容が不正の場合は 200 OK が返されるが
            },
            beforeSend: function(xhr){
                xhr.overrideMimeType("text/html;charset=Shift_JIS");
                //ajaxのテキスト受信がShift_JISであることを設定
                //作業が終わった時のデータの受信でSHIFT-JISが使われているため
                //utf8が使われていれば,この作業は不要
            }
        })
        .done(function( data ) {
            //作業が終わった時,Webサーバからメッセージデータの受信と表示
            //dataにWebサーバからの受信メッセージ文字列を受け取っている
            //置き先は「<div id="temptext"></div>」
            $("#temptext").val(data);
            $("#tempform").submit();
        });
    };
   
    // ファイル選択フォームからの入力
    $("#fileselect").bind("change", function () {
        // 選択されたファイル情報を取得
        var files = this.files;

        // アップロード処理
        uploadFiles(files);
        return false;
    });

    // ドラッグドロップからの入力
    $("#target").bind("drop", function (e) {
        // ドラッグされたファイル情報を取得
        var files = e.originalEvent.dataTransfer.files;

        // アップロード処理
        uploadFiles(files);
        // false を返してデフォルトの処理を実行しないようにする
        return false;
    })
    .bind("dragenter", function () {
        // false を返してデフォルトの処理を実行しないようにする
        return false;
    })
    .bind("dragover", function () {
        // false を返してデフォルトの処理を実行しないようにする
        return false;
    });
});
</script>
</head>
<body>
<h2>File Upload by Drag and Drop</h2>
<?php print $hiddenreply."<br>\n";?>
file selecter<br>
<input id="fileselect" type="file" />
<br><br>
Drag and Drop area<br>
<div id="target" draggable="true" style="width:500px;background:#ffcccc;border:#ff0000 solid 1px;">
    <br />
    <div id="mylist">&nbsp;&nbsp;&nbsp;Drop File(s)</div>
    <br />
</div>
<form id="tempform" method="POST" style="display:none">
<input id="temptext" type="text" name="hiddenreply">
</form>
</body>
</html>
ページ表示の例
(これは表示の様子を示しているだけでこの表示からはどこにもアップロードされない)
 file selectのボタンからファイルを1つだけ選択すると直後にアップロードされる
また,ファイルを1つだけdrag and Drop areaにドロップしても直後にアップロードされる。

File Upload by Drag and Drop

file selecter


Drag and Drop area

   Drop File(s)



Webサーバとブラウザとのデータ交換の流れ

ここでは,ファイルアップロード終了時に起動する関数が,

        .done(function( data ) {
            //作業が終わった時,Webサーバからメッセージデータの受信と表示
            //dataにWebサーバからの受信メッセージ文字列を受け取っている
            //置き先は「<div id="temptext"></div>」
            $("#temptext").val(data);
            $("#tempform").submit();
        });

となっているため,
$("#temptext").val(data);
でWebサーバからの受信メッセージを,
htmlのbody内のフォームtempformのtemptext(このフォームにはsubmitボタンは無い)
に置いた後
$("#tempform").submit();
でフォームからtemptext(textで名前はhiddenreply)を送りながらサブミットを発信し,
ページ全体を書き換えている。



3.複数ファイルを選択し,即時にアップロード


前の例を改造し,複数ファイルの送信ができるようにした。
ファイル選択のための<input id="fileselect" type="file" multiple="multiple" />はmultiple="multiple"により複数ファイルが扱えるようになっている。Drag and Drop area(id="target")はdraggable="true" になっていて,もともと複数ファイルを受け付けることができる。
送信側と受信側のキーになる共通のデータの名前は「tfiles」となっており,これは配列になっている。
受け取り側のPHPは複数ファイル受け取り用になっている。例えば3つのファイルを名前「tfiles」で送信した場合の変数名は次のようになっている


1つ目のファイル
2つ目のファイル
3つ目のファイル
受信状態
$_FILES["tfiles"]["error"][0]
$_FILES["tfiles"]["error"][1]
$_FILES["tfiles"]["error"][2]
一時ファイル名
$_FILES["tfiles"]["tmp_name"][0]
$_FILES["tfiles"]["tmp_name"][1]
$_FILES["tfiles"]["tmp_name"][2]
送信元のファイル名
$_FILES["tfiles"]["name"][0]
$_FILES["tfiles"]["name"][1]
$_FILES["tfiles"]["name"][2]


ファイル受け取り側はすべてのファイルを受け取ったら,受信ログ付きで,<html>タブ内に表示されるべき部分をブラウザ側に送信する。

List 3.1 複数ファイルを選択し,即時にアップロード mfu.php ダウンロード
<?php
$reply=false;
$report="";
if( isset( $_FILES["tfiles"]["error"] ) ) {
    foreach( $_FILES["tfiles"]["error"] as $key => $UStatus ) {
        if( $UStatus === UPLOAD_ERR_OK ) {
            $tmp_name = $_FILES["tfiles"]["tmp_name"][ $key ];
            $name     = $_FILES["tfiles"]["name"][ $key ];
            mb_language("Japanese");
            $name1=mb_convert_encoding($name, "SJIS", "utf-8");
            move_uploaded_file( $tmp_name, "./$name1" );
            $report.="ファイル[ ".$name1." ]を受け取りました。<br>\n";
        }
    }
    $reply=true;
}
?>

<?php
//ajaxに対する応答の時は<html>のみ返送する仕組みのはじめ
if ($reply==false) print "<html>";
?>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=S-JIS">
<script type="text/javascript" src="/jquery/jquery-2.1.3.min.js"></script>
<script>
$(function () {
    var uploadFiles = function (files) {
        // FormData オブジェクトを用意
        var fd = new FormData();

        // ファイル情報を追加する
        for (var i = 0; i < files.length; i++) {
            fd.append("tfiles[]", files[i]);
        }

        // XHR で送信
        $.ajax({
            //url: "xxxx.php", //formではaction=に記述する名前,省略時は自分自身
            type: "POST",
            data: fd,
            mode: 'multiple',
            processData: false,
            contentType: false,
            error: function(XMLHttpRequest, textStatus, errorThrown){
                err=XMLHttpRequest.status+"\n"+XMLHttpRequest.statusText;
                alert(err);
                //urlが不正など通信以上の場合は 404 not found などが表示される
                //urlが正しいが返信内容が不正の場合は 200 OK が返されるが
            },
            beforeSend: function(xhr){
                xhr.overrideMimeType("text/html;charset=Shift_JIS");
                //ajaxのテキスト受信がShift_JISであることを設定
                //作業が終わった時のデータの受信でSHIFT-JISが使われているため
                //utf8が使われていれば,この作業は不要
            }
        })
        .done(function( res ) {
            $("body").html(res);
        });
    };

    // ファイル選択フォームからの入力
    $("#fileselect").bind("change", function () {
        // 選択されたファイル情報を取得
        var files = this.files;

        // アップロード処理
        uploadFiles(files);
    });

    // ドラッグドロップからの入力
    $("#target").bind("drop", function (e) {
        // ドラッグされたファイル情報を取得
        var files = e.originalEvent.dataTransfer.files;

        // アップロード処理
        uploadFiles(files);
        // false を返してデフォルトの処理を実行しないようにする
        return false;
    })
    .bind("dragenter", function () {
        // false を返してデフォルトの処理を実行しないようにする
        return false;
    })
    .bind("dragover", function () {
        // false を返してデフォルトの処理を実行しないようにする
        return false;
    });
});
</script>
</head>
<body>
<h2>File Upload by Drag and Drop</h2>
<?php if ($reply==true) echo $report."<br>"; ?>
file selecter<br>
<input id="fileselect" type="file" multiple="multiple" />
<br><br>
Drag and Drop area<br>
<div id="target" draggable="true" style="width:500px;background:#ffcccc;border:#ff0000 solid 1px;">
    <br />
    <div id="mylist">&nbsp;&nbsp;&nbsp;Drop File(s)</div>
    <br />
</div>
</body>
<?php
//ajaxに対する応答の時は<html>のみ返送する仕組みのおわり
if ($reply==false) print "</html>";
?>
ページ表示の例
(これは表示の様子を示しているだけでこの表示からはどこにもアップロードされない)
 file selectのボタンから複数のファイルを選択すると直後にアップロードされ,
また,複数のファイルをdrag and Drop areaにドロップしても直後にアップロードされる。

File Upload by Drag and Drop

file selecter


Drag and Drop area

   Drop File(s)



4.複数ファイルを選択後,送信ボタンによりアップロード


ファイル選択直後にアップロードが始まるというのは,ユーザにとって 手数が減る代わりに,思い通りのファイルが選ばれているかどうか確認できず不安を誘うかもしれない。ファイル選択・選択ファイル確認の後,送信ボタンで送 信するようにしたいことがある。こうすることで意図していないファイルを誤って選択した場合,キャンセルすることもできる。
ファイル選択時にファイル名を取得して表示しているが同時に,javascriptのグローバル変数にファイル情報を保存し,送信ボタンによって,そのファイル情報を使って送信している。キャンセルボタンが押された時は,その情報を消去している。

List 4.1 複数ファイルを選択後,送信ボタンによりアップロード mfub.php ダウンロード
<?php
if( isset( $_FILES["tfiles"]["error"] ) ) {
    foreach( $_FILES["tfiles"]["error"] as $key => $UStatus ) {
        sleep(1); //テストのため1秒待つ。実用のためには不要なのでコメントアウトする
        if( $UStatus === UPLOAD_ERR_OK ) {
            $tmp_name = $_FILES["tfiles"]["tmp_name"][ $key ];
            $name     = $_FILES["tfiles"]["name"][ $key ];
            mb_language("Japanese");
            $name1=mb_convert_encoding($name, "SJIS", "utf-8");
            move_uploaded_file( $tmp_name, "./$name1" );
            print "ファイル[ ".$name1." ]を受け取りました。<br>\n";
        }
    }
    exit;
}
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=S-JIS">
<script type="text/javascript" src="/jquery/jquery-2.1.3.min.js"></script>
<script>
var G_files="";
$(function () {
    var showFiles = function (files) {
        if (files.length==0) return false;
        //ファイル名一覧を作る
        var filelist = "";
        for(var i=0; i<files.length; i++){
            filelist += files[i].name + "<br>";
        }
        $("#mylist").html(filelist);
        return false;
    };

    var uploadFiles = function (files) {
        if (files=="") return;
       
        document.body.style.cursor = 'wait';

        // FormData オブジェクトを用意
        var fd = new FormData();

        // ファイル情報を追加する
        for (var i = 0; i < files.length; i++) {
            fd.append("tfiles[]", files[i]);
        }

        // XHR で送信
        $.ajax({
            //url: "xxxx.php", //formではaction=に記述する名前,省略時は自分自身
            type: "POST",
            data: fd,
            mode: 'multiple',
            processData: false,
            contentType: false,
            timeout: 10000,  // 単位はミリ秒
            error: function(XMLHttpRequest, textStatus, errorThrown){
                err=XMLHttpRequest.status+"\n"+XMLHttpRequest.statusText;
                alert(err);
                //urlが不正など通信以上の場合は 404 not found などが表示される
                //urlが正しいが返信内容が不正の場合は 200 OK が返されるが
                document.body.style.cursor = 'auto';
                $("#sendfiles").attr('disabled', false);
                $("#fileselect").attr('disabled', false);
                $("#cancel").attr('disabled', false);
            },
            beforeSend: function(xhr){
                xhr.overrideMimeType("text/html;charset=Shift_JIS");
                //ajaxのテキスト受信がShift_JISであることを設定
                //作業が終わった時のデータの受信でSHIFT-JISが使われているため
                //utf8が使われていれば,この作業は不要
                $("#sendfiles").attr('disabled', true);
                //ボタンを無効にして二重送信防止
                $("#fileselect").attr('disabled', true);
                $("#cancel").attr('disabled', true);
            }
        })
        .done(function( res ) {
            $("#report").html(res);
            document.body.style.cursor = 'auto';
            $("#sendfiles").attr('disabled', false);
            $("#fileselect").attr('disabled', false);
            $("#cancel").attr('disabled', false);
            $("#cancel").click();
        });
    };

    // ファイル選択フォームからの入力
    $("#fileselect").bind("change", function () {
        // 選択されたファイル情報を取得
        G_files = this.files;
        //ファイル表示
        showFiles(G_files);
    });

    //送信ボタン
    $("#sendfiles").bind("click", function (e) {
        // アップロード処理
        uploadFiles(G_files);
    });
   
    //キャンセルボタン
    $("#cancel").bind("click", function (e) {
        $("#mylist").html("Drop File(s)");
        G_files="";
        $("#fileselect")[0].value = "";
    });
   
    // ドラッグドロップからの入力
    $("#target").bind("drop", function (e) {
        // ドラッグされたファイル情報を取得
        G_files = e.originalEvent.dataTransfer.files;
        //ファイル表示
        showFiles(G_files);
        // false を返してデフォルトの処理を実行しないようにする
        return false;
    })
    .bind("dragenter", function () {
        // false を返してデフォルトの処理を実行しないようにする
        return false;
    })
    .bind("dragover", function () {
        // false を返してデフォルトの処理を実行しないようにする
        return false;
    });
});
</script>
</head>
<body>
<h2>File Upload by Drag and Drop</h2>
<div id="report"></div>
file selecter<br>
<input id="fileselect" type="file" multiple="multiple" />
<br><br>
Drag and Drop area<br>
<div id="target" draggable="true" style="width:500px;background:#ffcccc;border:#ff0000 solid 1px;">
    <br />
    <div id="mylist">Drop File(s)</div>
    <br />
</div>
<input id="sendfiles" type="button" value="送信"">
<input id="cancel" type="button" value="キャンセル"">
</body>
</html>
ページ表示の例
(これは表示の様子を示しているだけでこの表示からはどこにもアップロードされない)
 file selectのボタンから複数のファイルを選択するか,
複数のファイルをdrag and Drop areaにドロップすると,
drag and Drop areaに選択されたファイル名が表示される。(ここでは表示されない)
送信ボタンを押すとアップロードされる。
キャンセルボタンでキャンセルされる。

File Upload by Drag and Drop

file selecter


Drag and Drop area

Drop File(s)



5.複数ファイルを選択後,送信ボタンによりアップロード(見た目を修正)


ファイル選択ボタン(ブラウザによっては参照ボタン)はブラウザによって形状が違って見える。そこで,ファイル選択ボタンを表現 している<input type="file"....>を大きさ0の非表示にしてしまい,自前で作成したファイル選択ボタンを置き,これが押されたら,本来のファイル選 択ボタンを内部的に押すようにすれば,見た目が改善される。

複数ファイルを選択後,送信ボタンによりアップロード(見た目を修正) mfub2.php ダウンロード
(変更点のみ phpファイルは「デモphpファイル」内にある)
ファイル選択ボタンを表現 している<input type="file"....>を大きさ0の非表示にしてしまい,
自前で作成したファイル選択ボタンを設定する記述

 :
<input id="fileselect" type="file" multiple="multiple" style="width:0;height:0; display:none"/>
<INPUT type=button value="ファイル選択" onclick="$('#fileselect').click();">
 :
ページ表示の例
(これは表示の様子を示しているだけでこの表示からはどこにもアップロードされない)
 ファイル選択ボタンが自前のものとなり,「ファイル選択」と表示されるようになり,
単純化された。
複数のファイルを,「ファイル選択」ボタンで選んでも,ドロップ領域にdrag&dropしても,
「送信」ボタンを押すことで送信される。
「キャンセル」ボタンにより,キャンセルすることもできる。

File Upload by Drag and Drop


   Drop File(s)



6.複数ファイルを選択後,送信ボタンによりアップロード(進捗表示付き)


アップロードの進捗を棒グラフで見えるようにする。$.ajaxは進捗を戻してくる仕組みがあるので,色付きの領域(id="progress_bar")の大きさ(width)を変えることで,進捗棒グラフにする。
phpファイルは「デモphpファイル」内にある
この進捗グラフは,アップロード作業中だけ表示される。

ページ表示の例
(これは表示の様子を示しているだけでこの表示からはどこにもアップロードされない)
複数ファイルを選択後,送信ボタンによりアップロード(進捗表示付き) mfub2p.php ダウンロード

File Upload by Drag and Drop


   Drop File(s)

 60%