質問されていた「画像と動画をどのように識別させるのか」についてですが、それはもともとやっている方法になると思います。
参考サイト(※Blobの項目について https://lab.syncer.jp/Web/JavaScript/Snippet/25/ )のコードに適用するとこんな感じになります。
----
<body>
<form>
<input id="target" type="file" multiple>
</form>
<script>
document.getElementById("target").addEventListener("change", function () {
var fileList = this.files;
for (var i = 0, l = fileList.length; l > i; i++) {
var blobUrl = window.URL.createObjectURL(fileList[i]);
const reader = new FileReader();
reader.onload = () => {
var child = null;
if (reader.result.indexOf("data:image/jpeg;base64,") === 0 ||
reader.result.indexOf("data:image/png;base64,") === 0) {
child = document.createElement("img");
} else if (reader.result.indexOf("data:video/mp4;base64,") === 0) {
child = document.createElement("video");
child.setAttribute("controls", null);
} else if (reader.result.indexOf("data:application/pdf;base64,") === 0) {
child = document.createElement("iframe");
} else {
alert("対象外のファイルです");
}
if (child !== null) {
child.src = blobUrl;
document.body.appendChild(child);
}
};
reader.readAsDataURL(fileList[i]);
}
});
</script>
</body>
----
大きな違いは child.src = blobUrl; だけです。
「Data URI で動画を表示する方法は対応ブラウザの関係で避けた方が良い」があるので、それに対応しただけな感じですね。
実行して開発モードで「Elements」を見ていただくとわかりますが、
DataURLを使うと、もともとは、
<img src="data:image/jpeg;base64,~~~">
とかだったのが、
<img src="blob:null/~~~">
のようになっています。
これをふまえると、Blobに何を覚えさせておくのか、と言うのは疑問になってきて、結局Blobでなくてもいいのではないか、と思えてきます。
お礼
アドバイスありがとうございます、役割をよく理解できずに dell_ok さんにお聞きしておりました、申し訳ありません。 innerHTML を使う場合要素を空にする場合を除いて HTML のエスケープ処理を行い後の改修にて脆弱性が生まれる余地をなくすべきだとアドバイスを頂いておりました。 Document.createTextNode を使う方が良いかもしれませんね… 最新コードの146、149、153、233、236、240行目を変更いたしました。 要素を空にするコードではないかと勘違いしていたようで、初めに dell_ok さんにわからないところをお聞きしたほうが良かったです。 ※以前アドバイス頂いたコード ※元のコード function lengthCheck() { const left = this.dataset.maxlength - this.value.length; if (left >= 0) { this.nextElementSibling.innerHTML = 'あと<strong>' + left + '</strong>文字'; this.dataset.submit_disabled = this.value.length === 0; } else { this.nextElementSibling.innerHTML = '<strong>' + -left + '</strong>文字超過しています'; this.dataset.submit_disabled = true; } ↓ ※エスケープ処理 function escapeHTML(値) { _ var a = document.createElement('span'); _ a.textContent = 値; _ return a.innerHTML; } 要素.innerHTML = '<strong>' + escapeHTML(文字列) + '</strong>'; ※最新コード https://wandbox.org/permlink/ozofFRK7rkjCXV76 ______________________________ 質問の期限が切れてしまったため下記リンクに質問を立てさせていただきました。よろしくお願い致します。 ※新規質問 https://okwave.jp/qa/q10207678.html