首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Flex/AS3 與 JS 交互:HTML 按鈕觸發 AS 保存圖片被安全沙箱阻擋

     編輯:程式設計疑難解答

問題現象

原 AS 內部按鈕監聽可正常彈出「另存為」對話框保存圖片。改為 HTML 按鈕調用 JS 接口,再由 JS 調用 AS 方法時,雖然 AS 代碼執行了,但瀏覽器不彈出保存對話框。

根本原因

Flash Player 安全沙箱限制:FileReference.save() 或 FileReference.download() 等文件操作必須由**用戶直接觸發的事件**(如 MouseEvent.CLICK)調用。JS 調用 AS 方法屬於間接調用,不在用戶信任事件鏈中,被安全機制攔截。

解決方案

方案一:保持 AS 內部按鈕,通過 JS 控制顯示/隱藏

在 AS 中保留真實的保存按鈕(設為透明或移出可視區),HTML 按鈕點擊時通過 ExternalInterface.call 觸發 AS 內部邏輯使按鈕獲得焦點並模擬點擊,但此法繞過風險大,不推薦。

方案二:JS 直接實現保存(推薦)

將圖片數據(Base64 或 Blob)從 AS 傳給 JS,由 JS 利用 HTML5 <a download> 或 FileSaver.js 實現保存,完全繞過 Flash 安全限制。

實現步驟

  1. AS 端:將 BitmapData 編碼為 Base64 字符串,通過 ExternalInterface.call("jsSaveFunction", base64Str) 傳給 JS。
  2. 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);
    }

注意事項

  • AS 到 JS 傳輸大量 Base64 可能導致性能問題,大圖建議分塊傳輸或改用 FileReference 上傳服務器再下載。
  • 確保頁面允許彈出窗口/下載,部分瀏覽器會攔截自動下載。
  • 長期建議:遷移至純 HTML5/Canvas 方案,放棄 Flash 技術棧。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved