1

同様のトピックをすべて読みましたが、運が悪かったので、このエラーに関する新しい質問を投稿しています。

次のコードを使用して、別のswfファイルからswfファイルをロードしようとしています:

var loader:Loader = new Loader()

//listen for loading progress
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);

//listen for when the load is finished
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);

loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onLoaderError);

//load!
var rr:URLRequest = new URLRequest("http://localhost/Gen-Tree.swf")
loader.load(rr);


function onLoaderError(event:SecurityErrorEvent) {
    trace("hi")
}

function onProgress(event:ProgressEvent):void
{
    //calculate how much has been loaded
    var percentageLoader:Number = event.bytesLoaded / event.bytesTotal;

    //use your percentage number here to drive a loader bar graphic
}

function onComplete(event:Event):void
{
    //remove listeners now that loading is done
    loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
    loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onComplete);

    //add loaded swf to the stage
    addChild(loader.content);

}

次のようなエラーメッセージが表示されます。

SecurityDomain 'http://localhost/Gen-Tree.swf' tried to access incompatible context 'file:///C|/Users/Alex/Desktop/Gen%2DTree%202012/Programming/loader.swf'
*** Security Sandbox Violation ***
SecurityDomain 'http://localhost/Gen-Tree.swf' tried to access incompatible context 'file:///C|/Users/Alex/Desktop/Gen%2DTree%202012/Programming/loader.swf'
*** Security Sandbox Violation ***
SecurityDomain 'http://localhost/Gen-Tree.swf' tried to access incompatible context 'file:///C|/Users/Alex/Desktop/Gen%2DTree%202012/Programming/loader.swf'

何か案は?

4

3 に答える 3

10

ファイルシステムから外部swfをロードしようとしています。これにより、セキュリティエラーがスローされます。サーバーに配置すると、両方のswfsが同じドメインにある限り、正常に機能するはずです。または、ローカルサーバーを実行して、それを試してみてください。

2つのswfsが同じドメインにない場合は、を追加する必要がありますcrossdomain.xml。サーバールートに移動し、次のようになります。

<?xml version="1.0"?>
<cross-domain-policy>
    <allow-access-from domain="*" />
</cross-domain-policy>

*ただし、セキュリティ上のリスクにさらされる可能性があるため、単に使用するべきではありません。他のドメインを具体的にホワイトリストに登録する必要があります。クロスドメインポリシーファイルの詳細については、こちらをご覧ください。

更新:
さらに、ローダーswfは(を介してloader.content)ロードしているコンテンツにアクセスしているため、そのコンテンツswfにセキュリティ権限を追加する必要があります(と呼ばれているように見えますGen-Tress.swf)。

import flash.system.Security;

Security.allowDomain("*");

また、これLoaderは、の代わりにwithにDisplayObject直接追加できることを意味します。のコンテンツにアクセスしないことで、通常、セキュリティサンドボックス違反エラーを回避でき、ドメインの許可やクロスドメインポリシーに対処する必要がなくなります。stageaddChild(loader)addChild(loader.content)Loader

于 2012-07-11T21:25:20.977 に答える
4

swf をロードしてから、ローダーのコンテンツを loader.loadBytes() で再ロードすることができます。そうすれば、swf の bytearray クローンを作成し、セキュリティ サンドボックスをバイパスできます。これまでのところ、画像でうまく機能します。私のブログでプロセスを説明しました: http://www.inklink.co.at/blog/?p=14

画像付きの例は次のとおりです。

function loadPicture():void
{
    var req:URLRequest = new URLRequest("YOUR_URL_HERE");
    var _picLoader:Loader = new Loader();
    _picLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,loader2ByteArray);
    _picLoader.load(req);
}
 
function loader2ByteArray(evt:Event):void
{
    var lInfo:LoaderInfo = LoaderInfo(evt.target);
    var ba:ByteArray = lInfo.bytes;
    reloadByteArray(ba);
}
 
function reloadByteArray(ba:ByteArray):void
{
    var reloader:Loader = new Loader();
    reloader.loadBytes(ba);
    reloader.contentLoaderInfo.addEventListener(Event.COMPLETE, reloaderComplete);
}
 
function reloaderComplete(evt:Event):void
{
    var imageInfo:LoaderInfo = LoaderInfo(evt.target);
    var bmd:BitmapData = new BitmapData(imageInfo.width,imageInfo.height);
    bmd.draw(imageInfo.loader);
    var resultBitmap:Bitmap = new Bitmap(bmd);
    addChild(resultBitmap);
}

それが役に立てば幸い!

于 2012-07-11T22:27:41.277 に答える
1
var loader_context:LoaderContext = new LoaderContext();
if (Security.sandboxType!='localTrusted') loader_context.securityDomain = SecurityDomain.currentDomain;
loader_context.applicationDomain = ApplicationDomain.currentDomain;
currentLoader = new Loader();
currentLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
currentLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);
currentLoader.load(new URLRequest(baseLink + pName + ".swf"), loader_context);

追加してみるのもいいかもしれませんloadercontext

于 2012-08-23T07:40:14.197 に答える