[英]Share local blob data between two client-only JS applications deployed on different domains
我有兩個用 JS 編寫的僅限客戶端(后端是靜態文件服務器)的應用程序。 一個是通過MediaRecorder
API 錄制視頻(例如網絡攝像頭)的MediaRecorder
(這會產生一個Blob
對象)。 另一個應用程序是視頻編輯器(不要介意它是如何實現的)。
這兩個應用程序部署在不同的域(例如foo-recorder.com
和foo-editor.com
)。 我的目標是盡可能輕松地編輯您的錄音。 我希望錄音機有一個按鈕“在編輯器中編輯錄音”,可以打開已經加載錄音的編輯器。
一個簡單的解決方案是在記錄器中使用URL.createObjectUrl(blob)
,對該 URL 進行 URL 編碼並將其作為查詢參數傳遞給編輯器。 例如https://foo-editor.com?video=blob://...
。 但是,據我所知,瀏覽器不允許站點訪問來自另一個域的 blob URL。 (這可能是出於很好的隱私原因。)
我也想過:
所以我想不出一個可行的解決方案。 如果它根本不起作用,我也不會感到驚訝,因為它在隱私和安全方面可能非常棘手。
有誰知道如何將這個 blob 從一個應用程序傳遞到另一個應用程序? 顯然,不應上傳 blob。
感謝 Musa 的提示,我找到了一個解決方案: postMessage
允許我將Blob
傳遞給編輯器,即使它部署在另一個域上。 記錄器必須在加載了編輯器的情況下打開一個新的瀏覽內容。 這可以是:
windows.open
打開一個彈出窗口src
的<iframe>
。 通過iframeDomNode.contentWindow
獲取上下文。 現在可以使用postMessage
向該上下文發送消息:
const iframe = document.getElementById('editor-iframe');
iframe.contentWindow.postMessage(videoBlob, "*");
// ^ TODO: change "*" to the specific target origin in production code!!!
在編輯器方面,我可以通過以下方式接收該消息:
window.addEventListener("message", event => {
// TODO: in real code, you should check `event.origin` here!
const v = document.getElementById("a-video-element");
v.src = URL.createObjectURL(event.data);
}, false);
注意:如果您在記錄器端生成 blob URL,將其傳遞給編輯器,編輯器仍然無法訪問它。 所以你需要直接傳遞blob。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.