下面是一個簡單的例子,它只是使用文件輸入而不是通常使用的AJAX。請注意,第一個輸入連接到一個讀取文件並返回dataURL的函數。
但是,由於您沒有fileObject,而是具有代表文件內容的數據流,因此不能使用此方法。所以,我已經包含了第二個輸入,它連接到一個只將文件加載爲二進制字符串的函數。然後該字符串在被轉換爲dataURL之前用瀏覽器功能「手動」編碼base64。爲此,您需要知道要處理的文件類型,才能正確構建URL。
這是相當緩慢的,即使這檯筆記本電腦i7的加載和可能吸記憶就像沒有人的業務 - 手機可能會翻倒在昏迷(我沒有一個測試)
你應該能夠(var rawResult = evt.target.result;
)
將錯誤檢查留給讀者作爲練習。
<!DOCTYPE html>
<html>
<head>
<script>
"use strict";
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function byId(id,parent){return (parent == undefined ? document : parent).getElementById(id);}
// callback gets data via the .target.result field of the param passed to it.
function loadFileObject(fileObj, loadedCallback)
{
var reader = new FileReader();
reader.onload = loadedCallback;
reader.readAsDataURL(fileObj);
}
// callback gets data via the .target.result field of the param passed to it.
function loadFileAsBinary(fileObj, loadedCallback)
{
var reader = new FileReader();
reader.onload = loadedCallback;
reader.readAsBinaryString(fileObj);
}
window.addEventListener('load', onDocLoaded, false);
function onDocLoaded()
{
byId('fileInput1').addEventListener('change', onFileInput1Changed, false);
byId('fileInput2').addEventListener('change', onFileInput2Changed, false);
}
function onFileInput1Changed(evt)
{
if (this.files.length != 0)
{
var curFile = this.files[0];
loadFileObject(curFile, onVideoFileReadAsURL);
function onVideoFileReadAsURL(evt)
{
byId('vidTgt').src = evt.target.result;
byId('vidTgt').play();
}
}
}
function onFileInput2Changed(evt)
{
if (this.files.length != 0)
{
var curFile = this.files[0];
loadFileAsBinary(curFile, onVideoFileReadAsBinary);
function onVideoFileReadAsBinary(evt)
{
var rawResult = evt.target.result;
var b64Result = btoa(rawResult);
var prefaceString = "data:" + curFile.type + ";base64,";
// byId('vidTgt').src = "data:video/mp4;base64," + b64Result;
byId('vidTgt').src = prefaceString + b64Result;
byId('vidTgt').play();
}
}
}
</script>
<style>
</style>
</head>
<body>
<input type='file' id='fileInput1'/>
<input type='file' id='fileInput2'/>
<video id='vidTgt' src='vid/The Running Man.mp4'/>
</body>
</html>
只是爲了檢查我正確理解你,你是說加密的視頻塊被髮送到瀏覽器,之前被解密的JavaScript?如果是這樣的話,解密並不比把車開到街上解鎖還好,鑰匙放在裏面,擋風玻璃上有一個標誌,上面寫着「請不要偷走我」。也就是說,只要視頻足夠短,就可以在視頻元素上拋出一個Base64編碼的dataURL,因爲它是src,它可以工作。我不知道尺寸限制是多少,雖然52MB的mp4可以,但350MB的不是。 – enhzflep
是的,就是這樣。除了訪問頁面是有限的訪問和解密密鑰由用戶定義的事實。 我真的很喜歡Base64的想法,我會試試看。它可以工作。 – blaazzze
實際上,加密不是爲了保護內容本身。一旦用戶可以訪問該頁面,他就可以做任何他想做的事情。安全級別是爲了確保服務器無法訪問視頻的內容。這是用戶的財產,我們確認即使我們想要,我們也不能查看他們的文件。所以在進入服務器之前,所有內容都被加密。 – blaazzze