NakajiJapan

餓鬼の超弩級日記


FileApi + DragAndDrop + JQueryでドロップした画像ファイルを画面に描画する

今回はDrag And Dropしてみます。
ただやるんじゃ面白く無いのでローカルにある複数の画像ファイルをドラッグして画面に表示させるところまでやってみます。

JSとHTMLはこんな感じ。


Drag and Drop

Drop Here!!

EXIF Data from the JPEG file:

More EXIF details:

方法としては、ドラッグ対象となる要素にイベントを登録して必要とする処理を行わせます。
処理内容は、ドラッグしたファイルからファイル情報を読み込んだ後に画面に描画させます。
基本は前回と同じですね。ファイルの選択からドラッグをできるようにしただけですからね。。。

大元がこれイベントの登録をしています。

function init() {
		dandd = new Nakaji();

		window.addEventListener("dragenter", dandd.dragEnter, false);
		window.addEventListener("dragleave", dandd.dragLeave, false);

    	var dropBox = {};
		dropBox = document.getElementById("dropbox");
		dropBox.addEventListener("dragover", dandd.dragOver, false);
		dropBox.addEventListener("drop", dandd.drop, true);
}

あと、ドラッグしたファイルを読み込むときには「DataTransfer」という型をドロップしたファイルオブジェクトが情報を持っているのでこれを利用します。

		// ドラッグされたデータを取得
		var dt    = event.dataTransfer;
		var files = dt.files;
		var count  = files.length;

あとちょっと理由がわからなかったのですがメソッドがthisじゃだめだったのなぜなんだろうか???インスタンスかさせてないと認識できない?なのでメソッドを直接指定することにしました。

			// thisじゃだめなのはなぜ????
			// メソッドの登録
			reader.addEventListener("loadend", Nakaji.prototype.buildImageListItem, false);

だいたいできた。

■感想
・重い画像ファイルを一気にドラッグするとブラウザの処理が追いつかないみたいでファイル名が「undefined」になってしまうことがあるね。どうしたらいいものか。
(無理やりsleep()的なものおいておいた方がいいのかな?)
・これも後ろで非同期通信してみる(みたい)
・これだとIE、Chromeだと動かないのでクロスブラウザ的な対策が必要なんだな
そもそもIEは「addEventListener」がないからね
・GPSの情報取得してグーグルマップに登録的なことをしたいでげす。

デモ

■参考サイト
Drag & Drop - HTML5 版
JavaScript addEventListener()
W3C FileAPI in Firefox 3.6

Drag and drop file uploading using JavaScript
※コード汚かったけど結構参考になりました。ここだとSVGとかXHRとかもつかってアプロード中の処理もやってるからすごい。

No Comments »

FileReader(+JQuery)を利用して複数ファイルを選択した画像を画面に表示させる






File API sample(jquery version)

file name: file size:

HTML5の勉強っす。

今回はFileRead()を利用してみた。って話。

まだ策定中のFile APIなのですが、これを利用するとjavascriptからファイル情報や内容を読み込んで
アクセスができるようになるみたいですね。例をあげるとファイルをアップロードするときに予め対象の
画像情報を表示させといてから非同期で画像を保存する。的なこと簡単にできてしまうわけです。

現在はFirefoxでは実装されていてつかえるみたいなのですが、まだChromeで利用できないみたいですね。
ここいらへんで騒いでいます。

実際、まだ全体的にみても策定中のようで「FileWriter」なんてものもあるらしくてこれが決定!!というわけではない。とのこと。
なので、今後仕様が変わっていってしまうのは大いにあるようです。

だけどおもしろそうだったのでやってみた。

まずは、HTMLに


を記述してから複数ファイルを選択できるようにします。
(この時点でもうフラッシュいらないですね。はい。)

次は関数を呼ぶ。

// 読み込み用メソッド
function readFile() {
    // タグからファイル情報を読み込む
    var files = document.getElementById("file").files;

    // 配列作成
	var data = new Array();

    // 選択ファイル分走査する
    for (var cnt=0;cnt

複数選択したとき用にループしてファイルを走査する。

FileReaderCustomの中身でやっているものは

  • Onloadイベント処理の登録
  • ファイル情報を読み込んで画面に描画させる
    ここで画像情報を「reader.result」から取得してimgタグの「src」属性として登録する

  • onprogressイベント処理の登録
  • 現在処理中のファイル名を表示する

  • loadedendイベントイベント処理の登録
  • ログ「onprogressで表示した」情報を削除する

  • ファイルを指定した形式にして情報を読取る
  • できた!!これでボタンを押せば読み込みが始まります。
    あとは非同期でデータをPOSTしてやればOK。

    ■感想
    ・「input」タグのmultiple属性POSTしたらどうなるのかな?
    ・ファイルをアップするときになんていうかいい感じに連続的に表示できないかなーっておもった。
    ・ロード中の画像はその画像上かどこかに身長情報載せたい。
    ・クロスブラウザ対応できたら最高やね。。
    ・後ろ側の通信しなきゃね。

    デモ

    No Comments »