为什么从 JavaScript 调用 Flash 函数可以工作,但 FileReference 在 Flash 中不起作

why call flash function from javascript work but FileReference don't work in flash?

本文关键字:Flash FileReference 工作 JavaScript 调用 函数 为什么      更新时间:2023-09-26

我需要从javascript调用flash函数。我使用 flash.external 和 addCallback 来做到这一点。所有事情都运行良好,但是当我在闪存中使用文件引用时,功能无法打开我的浏览器......

请参阅下面的描述:
我用这段代码在javascript中调用我的函数: <input type="button" value="Browse" onclick="sendToFlash('Hello World! from HTML');" />你可以看到我所有的HTML,如下所示:

<html>
<head>
<title>Upload test</title>
</head>
<script>
function hello (size) {
    alert ("size hast: " + size);
}
function sendToFlash(val){
    var flash = getFlashObject();
    flash.new_browser(val);
}
var flash_ID = "Movie2";
var flash_Obj = null;
function getFlashObject(){
    if (flash_Obj == null){
        var flashObj;
        if (navigator.appName.indexOf( "Microsoft" ) != -1){
           flashObj = window[flash_ID];
        } 
        else{
           flashObj = window.document[flash_ID];
        }
        flash_Obj = flashObj;
    }
    return flash_Obj;
}
</script>
  <body>
    <center>
    <embed width="560" height="410" type="application/x-shockwave-flash" 
    flashvars="sampleVars=loading vars from HTML" 
    salign="" allowscriptaccess="sameDomain" allowfullscreen="false" menu="true" name="Movie2" 
    bgcolor="#ffffff" devicefont="false" wmode="window" scale="showall" loop="true" play="true" 
    pluginspage="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" 
    quality="high" src="Movie2.swf">
    </center>
    <input type="button" value="Browse" onclick="sendToFlash('Hello World! from HTML');" />
  </body>
</html>

当我在html页面中单击Browse时,javascript调用sendToFlash函数和SendToFlash函数将我的字符串(Hello World!来自HTML)发送到flash。
在闪存中,我得到这个字符串,代码如下:

resultsTxtField.text = "";
uploadButton.onPress = function () {
   return browse_file("Hello World! from Flash");
}
import flash.external.*;
ExternalInterface.addCallback("new_browser", this, browse_file);

function browse_file (my_test_val) {
    _root.resultsTxtField.text = "val: " + my_test_val;
    import flash.net.FileReference;
    var fileTypes:Array = new Array();
    var imageTypes:Object = new Object();
    imageTypes.description = "Images (*.jpg, *.jpeg, *.gif, *.png)";
    imageTypes.extension = "*.jpg; *.jpeg; *.gif; *.png";
    fileTypes.push(imageTypes);
    var fileListener:Object = new Object();
    var btnListener:Object = new Object();
    var fileRef:FileReference = new FileReference();
    fileRef.addListener(fileListener);
    fileRef.browse(fileTypes);
    fileListener.onCancel = function(file:FileReference):Void
    {
      _root.resultsTxtField.text += "File Upload Cancelled'n";
    }
    fileListener.onSelect = function(file:FileReference):Void
    {
      _root.resultsTxtField.text += "File Selected: " + file.name + " file size: "+ file.size + " file type: " + file.type;
      getURL("javascript:hello("+file.size+");");
    }
}

我只有一个场景,此代码位于此场景的根目录上。 我有一个名为 uploadButton 的影片剪辑,并且只有一个名为该示例中的按钮的矩形。
当您单击矩形时,browse_file("Hello World! from Flash");调用并打开浏览器,您可以选择要上传的照片。
当您在HTML中单击browse时,必须执行相同的过程,但正如您所看到的变量发送到功能,但选择照片browser不再打开。
我尝试了几种方法。例如,我将新功能设置为仅打开picture browser或设置新场景或使用gotoAndPlay等等,但还有另一个问题。

您可以从以下链接下载我的源代码:
http://www.4shared.com/zip/YTB8uJKE/flash_uploader.html
请注意,JavaScript onclick="sendToFlash('Hello World! from HTML');"在直接打开中不起作用。您必须在本地主机中打开它。

对于任何线索,我都会很高兴。
非常感谢
礼萨·阿米亚

你不能以编程方式调用browse(),它必须通过鼠标在 Flash 内部单击:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/FileReference.html#browse()

在 Flash Player

10 和 Flash Player 9 Update 5 中,您只能调用 此方法成功响应用户事件(例如,在 鼠标单击或按键事件的事件处理程序)。否则 调用此方法会导致 Flash Player 引发错误 例外。

经过一天的阅读,我知道出于安全原因这是不可能的。
然后,您不能以任何方式使用addCallback JavaScript代码打开文件引用。有关详细信息,请阅读文件参考从 js 浏览,模拟闪存中的按键解决方法


再次
感谢礼萨·阿米亚