記事の作成日 : 2020/03/07
前から少し、ファイルの読み込みってどうやるんだろうって、疑問に思っていたので、 <input type="file" id="data" style="width: 100%;">
<div id="output"></div>
<progress style="width:100%;height: 2em;" value="" max="" id="loaded"></progress>
<div class="srcode" id="console"></div>
<div id="tag"></div>
<!-- <div id="tag"></div> -->
<script>
document.getElementById("data").addEventListener("change", ReadFile2, false);
function ReadFile2(e) {
var f = e.target.files[0]; // files の0番目を扱う
var Fname = f.name;
var Flast = f.lastModified;
var FlastString = f.lastModifiedDate;
var Fsize = f.size;
var Ftype = f.type;
// 表を作成するところ
var out = ""; // 空文字列
out += "<table style='width:100%;' border='1'>"
out += "<tr><th><br>プロパティー<br></th><th><br>値<br></th></tr>"
out += "<tr><th>.name (ファイル名)</th><td>" + escape(Fname) + "</td><tr>"
out += "<tr><th>.lastModified (ファイルの最終更新日)</th><td>" + Flast + "</td><tr>"
out += "<tr><th>.lastModifiedDate (ファイルの最終更新日 テキスト)</th><td>" + Flast + "</td><tr>"
out += "<tr><th>.size (ファイルサイズ)</th><td>" + Fsize + "</td><tr>"
out += "<tr><th>.type (MIMEタイプ)</th><td>" + Ftype + "</td><tr>"
out += "</table>"
document.getElementById("output").innerHTML = out; // それを出力
// 大量のメモリ使用 の確認 おそらく、ファイルの容量のその8~10倍のメモリを食います。[base64 data: 方式]
if (10000000 <= Fsize) {
if (confirm("大量のメモリを使用します。\n\n(デバイスによって異なりますが、元のファイルの容量の,その8倍以上のメモリを必要とします。)\n使用メモリ(ピーク予測):" + Math.round((Fsize / 1024 / 1000) * 8) + " MB以上\n\n続行してよろしいですか?。") != 1) {
return; // OK 以外なら続きを実行しない。
}
}
// ファイルを読み込む処理
var r = new FileReader(); // File Reader API を使う
//目に見える部分 のやつの管理
var elm_loaded = document.getElementById("loaded");
var elm_console = document.getElementById("console");
var elm_tag = document.getElementById("tag");
// 初期値 の設定
elm_loaded.setAttribute("max", Fsize);
elm_console.textContent = "0 KB"
// 読み込み開始
r.readAsDataURL(f); // コンソールに出力するとBase64形式。resultで出力
// 読み込み中 の処理
r.addEventListener("progress", function(e) {
elm_console.textContent = Math.round(e.loaded / 1024) + " KB";
elm_loaded.setAttribute("value", e.loaded);
});
// 読み込んだ 時の処理
r.addEventListener("load", function() {
elm_console.textContent = "Loaded! 読み込めました!: " + Math.round(Fsize / 1024) + " KB";
elm_loaded.setAttribute("value", Fsize);
elm_tag.innerHTML = '';
if (Ftype.indexOf("audio") != -1) {
elm_tag.innerHTML = '<audio controls style="width:100%" src="' + r.result + '"><code>Audio</code>に対応していません。</audio>'; // どっちが早いんでしょうか…
} else if (Ftype.indexOf("image") != -1) {
elm_tag.innerHTML = '<img style="width:100%;" src="' + r.result + '">';
} else if (Ftype.indexOf("video") != -1) {
elm_tag.innerHTML = '<video controls style="width:100%;" src="' + r.result + '"><code>Video</code>に対応していません。</video>';
} else {
elm_tag.innerHTML = '<div style="width:100%;">' + escape(r.result) + '"</div>';
}
});
// 読み込みに失敗した 時の処理
r.addEventListener("error", function(e) {
elm_console.textContent = "何らかのエラーが発生しました";
});
}
function escape(s) {
return s.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
}
</script>
<style>
.none {
display: none;
visibility: hidden;
}
.visible {
display: contents;
visibility: visible;
}
</style>
<input type="file" id="data" style="width: 100%;">
<span style="background-color: khaki;">サーバーにアップロードされることはありませんが、安全のため、個人情報を含むファイルを選択しないようにしてください。</span>
<div id="output" style="width: 100%;"></div>
<progress style="width:100%;height: 2em;" value="" max="" id="loaded"></progress>
<div class="srcode" id="console" style="text-align: center; color: white;"></div>
<audio controls id="audio" class="none"><code>Audio</code>に対応していません。</audio>
<img controls id="image" class="none">
<video controls id="video" class="none"><code>Video</code>に対応していません。</video>
<div id="text" class="none"></div>
<!-- <div id="tag"></div> -->
<script>
document.getElementById("data").addEventListener("change", ReadFile, false);
function ReadFile(e) {
var f = e.target.files[0]; // files の0番目を扱う
var Fname = f.name;
var Flast = f.lastModified;
var FlastString = f.lastModifiedDate;
var Fsize = f.size;
var Ftype = f.type;
// 表を作成するところ
var out = ""; // 空文字列
out += "<table style='width:100%;' border='1'>"
out += "<tr><th><br>プロパティー<br></th><th><br>値<br></th></tr>"
out += "<tr><th>.name (ファイル名)</th><td>" + escape(Fname) + "</td><tr>"
out += "<tr><th>.lastModified (ファイルの最終更新日)</th><td>" + Flast + "</td><tr>"
out += "<tr><th>.lastModifiedDate (ファイルの最終更新日 テキスト)</th><td>" + Flast + "</td><tr>"
out += "<tr><th>.size (ファイルサイズ)</th><td>" + Fsize + "</td><tr>"
out += "<tr><th>.type (MIMEタイプ)</th><td>" + Ftype + "</td><tr>"
out += "</table>"
document.getElementById("output").innerHTML = out; // それを出力
// 大量のメモリ使用 の確認 おそらく、ファイルの容量のその8~10倍のメモリを食います。[base64 data: 方式]
if (10000000 <= Fsize) {
if (confirm("大量のメモリを使用します。\n\n(デバイスによって異なりますが、元のファイルの容量の,その8倍以上のメモリを必要とします。)\n使用メモリ(ピーク予測):" + Math.round((Fsize / 1024 / 1000) * 8) + " MB以上\n\n続行してよろしいですか?。") != 1) {
return; // OK 以外なら続きを実行しない。
}
}
// ファイルを読み込む処理
var r = new FileReader(); // File Reader API を使う
//目に見える部分 のやつの管理
var elm_loaded = document.getElementById("loaded");
var elm_console = document.getElementById("console");
var elm_text = document.getElementById("text");
var elm_audio = document.getElementById("audio");
var elm_image = document.getElementById("image");
var elm_video = document.getElementById("video");
// 初期値 の設定
elm_loaded.setAttribute("max", Fsize);
elm_console.textContent = "0 KB"
// 読み込み開始
r.readAsDataURL(f); // コンソールに出力するとBase64形式。resultで出力
// 読み込み中 の処理
r.addEventListener("progress", function(e) {
elm_console.textContent = Math.round(e.loaded / 1024) + " KB";
elm_loaded.setAttribute("value", e.loaded);
});
// 読み込んだ 時の処理
r.addEventListener("load", function() {
elm_console.textContent = "Loaded! 読み込めました!: " + Math.round(Fsize / 1024) + " KB";
elm_loaded.setAttribute("value", Fsize);
elm_audio.setAttribute("class", "none");
elm_image.setAttribute("class", "none");
elm_video.setAttribute("class", "none");
elm_text.setAttribute("class", "none");
elm_audio.setAttribute("src", "");
elm_image.setAttribute("src", "");
elm_video.setAttribute("src", "");
elm_text.innerHTML = '';
if (Ftype.indexOf("audio") != -1) {
//elm_tag.innerHTML = '<audio controls src="' + r.result + '"><code>Audio</code>に対応していません。</audio>'; // どっちが早いんでしょうか…
elm_audio.setAttribute("class", "visivle");
elm_audio.setAttribute("src", r.result);
} else if (Ftype.indexOf("image") != -1) {
//elm_tag.innerHTML = '<img style="width:50%;" src="' + r.result + '">';
elm_image.setAttribute("class", "visivle");
elm_image.setAttribute("src", r.result);
} else if (Ftype.indexOf("video") != -1) {
//elm_tag.innerHTML = '<video controls style="width:50%;" src="' + r.result + '"><code>Video</code>に対応していません。</video>';
elm_video.setAttribute("class", "visivle");
elm_video.setAttribute("src", r.result);
} else {
elm_text.setAttribute("class", "visible");
elm_text.innerHTML = '<div style="width:50%;">' + escape(r.result) + '"</div>';
}
});
// 読み込みに失敗した 時の処理
r.addEventListener("error", function(e) {
elm_console.textContent = "何らかのエラーが発生しました";
});
}
function escape(s) {
return s.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
}
</script>
<input type="file" id="data">
type
を file
にすると、ファイルの選択ができるようになります。id
は今回は,data
とします。console.log
を使用していきます。Alert
などでは、詳しく中身を見ることができないかもしれません。
document.getElementById("data").addEventListener("change", ReadFile, false);
document.getElementById("HTMLで指定したid").addEventListener(イベント, ハンドラ(実行される関数など), false);
ファイルが選択されたかを判別するには、
addEventListenerを使用します。data
の change
が成立したら、後で作成する関数:ReadFile
を、実行します。function ReadFile(e) {
var f = e.target.files[0]; // files の1番目を扱う
addEventListener から関数を実行した場合、引数 func(引数)
を関数のほうに作成しておけば、File {name: "orig2.png", lastModified: 1582517238284, lastModifiedDate: Mon Feb 24 2020 13:07:18 GMT+0900 (日本標準時), webkitRelativePath: "", size: 3627942, …}
name: "orig2.png"
lastModified: 1582517238284
lastModifiedDate: Mon Feb 24 2020 13:07:18 GMT+0900 (日本標準時) {}
webkitRelativePath: ""
size: 3627942
type: "image/png"
var Fname = f.name; // ファイル名
var Flast = f.lastModified; // ファイルの最終更新日
var Fsize = f.size; // ファイルサイズ
var Ftype = f.type; // MIME タイプ
video/mp4
、audio/mp3
、image/png
、などです。
// ファイルを読み込む処理の下準備
var r = new FileReader(); // File Reader API を使う
FileReader API を使って、オブジェクトを作成します。// 読み込み開始
r.readAsDataURL(f); // Base64形式。r.result で出力
readAsDataURL(base64 形式) を使い、ファイルを読み込みます。
// 読み込み開始
r.readAsDataURL(f); // Base64形式。r.resultで出力
// 読み込み開始 の処理
r.addEventListener("loadstart",function(){
console.log("読み込み開始")
});
// 読み込み中 の処理
r.addEventListener("progress", function(e) {
console.log( e.loaded ); // バイト単位で、表示する。 .loaded
});
// 読み込んだ 時の処理
r.addEventListener("load", function() {
console.log( "読み込み完了!" );
});
// 読み込みに失敗した 時の処理
r.addEventListener("error", function(e) {
console.log("何らかのエラーが発生しました…");
});
addEventListenerで、読み込み開始、読み込み中、読み込み完了、読み込みエラー、が発生したときに、関数や、アラー関数が実行されます。<progress id="code_0" value="0" max="20" style="width: 100%;"></progress>
<script>
var progress_0 = document.getElementById('code_0');
setInterval(() => {
progress_0.value += Math.random();
if (progress_0.value >= 20) {
progress_0.value = 0;
}
}, 100);
</script>
[テキストファイル txt]
data:text/plain;base64,SW5zdGFs ...
[音声データ mp3]
data:audio/mp3;base64,EHwIi2O ...
reader.readAsText( f , "UTF-8")
reader.readAsText( f , "UTF-16")
var getARR_int8bit = new Int8Array(reader.result);
// [-37,132,83,22,-97, ...]
var getARR_uint8bit = new Uint8Array(reader.result);
// [172,82,12,211,54, ...]
var getARR_uint8bit_clamped = new Uint8ClampedArray(reader.result); // ?
23¾$`Z.ϦSòjaM½C¢FA
9öRn1ãçQ¢Wï}
HTML上に表示させる場合には、エスケープ処理を行うことをお勧めします。