Привет форум,
Никогда раньше не работал с as3, недавно понадобилось написать скрипт который позволил бы пользователю выбрать файлы, а затем передал бы JS скрипту имена этих файлов с их содержимое в Base64.
Помучившись пару часов выдавил из себя

Код AS3:
package{
import flash.net.FileReferenceList;
import flash.net.FileReference;
import flash.events.*;
import flash.external.ExternalInterface;
import flash.system.Security;
public class FileToBase64{
public var fileRef:FileReferenceList = new FileReferenceList();
public function FileToBase64():void{
Security.allowDomain('mydomain.com');
fileRef.addEventListener(Event.SELECT, fileSelectHandler);
ExternalInterface.addCallback('browseFiles', browse);
}
public function browse():void{
fileRef.browse();
}
public function fileSelectHandler(evn:Event):void{
for each(var selectedFile:FileReference in fileRef.fileList){
selectedFile.addEventListener(Event.COMPLETE, onReadyHandler);
try{
selectedFile.load();
} catch (e:Error) {
trace("Cannot load file!");
}
}
}
public function onReadyHandler(evn:Event){
//trace(evn.target);
var file = evn.target;
ExternalInterface.call('selectedFilesHandler("'+Base64.encode(file.data)+'")');
/*trace(file);
trace(Base64.encode(file.data));*/
}
}
}
И тестовую страничку:

Код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>SWFObject 2 static publishing example page</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
var FileToBase64Obj = null;
var path = 'http://mydomain.com';
window.onload = function(){
swfobject.embedSWF(path + 'FileToBase64.swf', 'test', '1', '1', '9.0.0', path + 'expressInstall.swf', null,
{'allowScriptAccess':'sameDomain', 'allownetworking':'yes', 'play':'true', 'movie':'FileToBase64.swf'}, {'id':'FileToBase64'}, flashLoaded);
};
function flashLoaded(e){
if(e.success){
FileToBase64Obj = e.ref;
browse();
}
}
function browse(){
if(typeof(FileToBase64Obj.browseFiles) == 'function'){
console.log('ok')
FileToBase64Obj.browseFiles();
}else{
console.log('fail')
window.setTimeout(arguments.callee, 32);
}
}
</script>
</head>
<body>
<div id="test">
</div>
</body>
</html>
В итоге вижу в консоли бровзера:

Код:
fail
fail
fail
fail
ok
Error calling method on NPObject!
FileToBase64Obj.browseFiles();
Гугл так и не дал внятного ответа, все файлы естественно на одном домене, прошу помощи у вас.
Добавлено через 5 часов 58 минут
Почитал апдейты секюрности для 10й версии Flash Player, там запретили вызов .browse() и .download() через калбэки, только по средству внутренних событий. Отлично, может кто-то подскажет как называется объект всего флеш мувика? Я повешу на него onclick, сделаю прозрачным и помещу над кнопкой.