原 AS 內部按鈕監聽可正常彈出「另存為」對話框保存圖片。改為 HTML 按鈕調用 JS 接口,再由 JS 調用 AS 方法時,雖然 AS 代碼執行了,但瀏覽器不彈出保存對話框。
Flash Player 安全沙箱限制:FileReference.save() 或 FileReference.download() 等文件操作必須由**用戶直接觸發的事件**(如 MouseEvent.CLICK)調用。JS 調用 AS 方法屬於間接調用,不在用戶信任事件鏈中,被安全機制攔截。
在 AS 中保留真實的保存按鈕(設為透明或移出可視區),HTML 按鈕點擊時通過 ExternalInterface.call 觸發 AS 內部邏輯使按鈕獲得焦點並模擬點擊,但此法繞過風險大,不推薦。
將圖片數據(Base64 或 Blob)從 AS 傳給 JS,由 JS 利用 HTML5 <a download> 或 FileSaver.js 實現保存,完全繞過 Flash 安全限制。
ExternalInterface.call("jsSaveFunction", base64Str) 傳給 JS。function jsSaveFunction(base64Data) {
// 轉 Blob
var byteChars = atob(base64Data.split(',')[1]);
var byteNumbers = new Array(byteChars.length);
for (var i = 0; i < byteChars.length; i++) byteNumbers[i] = byteChars.charCodeAt(i);
var byteArray = new Uint8Array(byteNumbers);
var blob = new Blob([byteArray], {type: 'image/png'});
// 創建下載鏈接
var url = URL.createObjectURL(blob);
var a = document.createElement('a');
a.href = url;
a.download = 'image.png';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
}