webを使ってパソコン上にあるローカルファイルをドラッグ&ドロップで操作することができる。 ローカルファイルをパソコン上で処理するために、わざわざwebを使って処理する必要はない。 ローカルファイルの内容をサーバに送ったりしたり、サーバでの処理結果をローカルファイルに保存したりするときに用いる操作に使える。
ソースコード
// ドロップ領域のdiv要素
var dp = null;
// ファイルロード進捗表示領域のdiv要素
var prog = null;
// ファイル情報表示領域のdiv要素
var info = null;
// ファイルの内容表示領域のdiv要素
var cont = null;
// 読み取り中止ボタンのbutton要素
var abrt = null;
// FileReaderインターフェースオブジェクト
var reader = null;
/* ----------------------------------------------------------------------*/
/* ページがロードされたときの処理 */
/* ----------------------------------------------------------------------*/
window.addEventListener("load", function() {
// ドロップ領域のdiv要素
dp = document.querySelector('#dp');
// ファイルロード進捗表示領域のdiv要素
prog = document.querySelector('#prog');
// ファイル情報表示領域のdiv要素
info = document.querySelector('#info');
// ファイルの内容表示領域のdiv要素
cont = document.querySelector('#cont');
// 読み取り中止ボタンのbutton要素
abrt = document.querySelector('#abrt');
// dragoverイベントのイベントリスナーをセット
dp.addEventListener("dragover",function(evt){
evt.preventDefault();
},false);
// dropイベントのイベントリスナーをセット
dp.addEventListener("drop",function(evt){
evt.preventDefault();
file_droped(evt);
},false);
// 中止ボタンにclickイベントのイベントリスナーをセット
abrt.addEventListener("click",abort,false);
},false);
/* ----------------------------------------------------------------------*/
/* ファイルがドロップされたときの処理 */
/* ----------------------------------------------------------------------*/
function file_droped(evt){
// 表示領域をクリア
info.innerHTML = "";
prog.innerHTML = "";
cont.innerHTML = "";
// ドロップされたファイルのFileインタフェースオブジェクト
var file = evt.dataTransfer.files[0];
if( !file ){
info.innerHTML = "<p>ファイルをドロップして下さい。</p>";
return;
}
// FileReaderインタフェースオブジェクト
reader = new FileReader();
// ファイルロードの進捗表示
reader.onprogress = function(evt){
if(evt.lengthComputable == true && evt.total>0){
var rate = (evt.loaded * 100 / evt.total).toFixed(1);
var msg = "";
msg += evt.total + "バイト中、 ";
msg += evt.loaded + "バイトをロードしました。";
msg += "(" + rate + "%)";
prog.innerHTML = msg;
}
}
// プロパティを表示
var msg = "";
msg += "size: " + file.size + "\n";
msg += "name: " + file.name + "\n";
msg += "type: " + file.type + "\n";
info.innerHTML = msg;
// 画像ファイル(SVGも含む)の場合
if( /^image/.test(file.type) ){
reader.readAsDataURL(file);
reader.onload = function(evt){
var el = document.createElement("object");
el.setAttribute("type",file.type);
el.setAttribute("data",reader.result);
cont.appendChild(el);
}
// ビデオファイルの場合
}else if( /^video/.test(file.type) ){
var el = document.createElement("video");
if( !/^(maybe|probably)/.test(el.canPlayType(file.type)) ){
return;
}
reader.readAsDataURL(file);
reader.onload = function(evt){
el.setAttribute("type",file.type);
el.setAttribute("src",reader.result);
el.setAttribute("controls",true);
}
// テキストファイルの場合
}else if(/^text/.test(file.type)){
reader.readAsText(file);
reader.onload = function(evt){
cont.appendChild(document.createTextNode(reader.result));
}
// 上記以外なら先頭の40バイト分を16進数表示
}else{
reader.readAsArrayBuffer(file);
reader.onload = function(evt){
var bytes = new Uint8Array(reader.result);
var str = "";
for( var i=0, len=Math.min(bytes.length,40); i<len; i++){
str += ( "0" + bytes[i].toString(16) ).slice(-2);
str += ( (i+1) % 16 == 0 ) ? "\n" : " ";
}
cont.appendChild(document.createTextNode(str));
}
}
}
/* ----------------------------------------------------------------------*/
/* ファイルのロードを中止 */
/* ----------------------------------------------------------------------*/
function abort(){
if(reader == null){
return;
}
reader.abort();
}
</script>
</HEAD>
<BODY>
<div id="dp">
<div id="prog">ここにデスクトップ上のファイルをドロップしてください</div>
<div><button id="abrt">読み取り中止</button></div>
<div id="info"></div>
<div id="cont"></div>
</div>
サンプル
ここにデスクトップ上のファイルをドロップしてください