AS3 SecurityError#2048 Mac vs Windows

时间:2012-08-12 18:50:54

标签: php actionscript-3 security sandbox

在将Sprite保存到服务器时,我似乎遇到了一个有趣的问题。当我在我的MAC上运行swf(远程)它工作正常但是当我从我的Windows计算机运行完全相同的URL时,我得到一个#2048 SecurityError。

这是我的AS3代码:

    public function saveSprite(s:Sprite):void {
        var bmpData:BitmapData = new BitmapData(s.width, s.height, true, 0xFFFFFF);
        bmpData.draw(s);
        var byteArray:ByteArray = PNGEncoder.encode(bmpData);
        var encodedFile:Base64Encoder = new Base64Encoder();
        encodedFile.encodeBytes(byteArray);

        var data:URLVariables = new URLVariables();
        data.fileData = encodedFile;
        data.fileName = "test.png";
        data.location = "temp/";

        var request:URLRequest = new URLRequest(scriptLocation);
        request.method = URLRequestMethod.POST;
        request.data = data;

        var loader:URLLoader = new URLLoader();
        loader.addEventListener(Event.COMPLETE, errorLog);
        loader.addEventListener(Event.OPEN, errorLog);
        loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, errorLog);
        loader.addEventListener(IOErrorEvent.IO_ERROR, errorLog);
        loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, errorLog);
        loader.addEventListener(ProgressEvent.PROGRESS, errorLog)

        try {
            loader.load(request);
        } catch (e:*) {
            debug.updateLog(e + "\n");
        }
    }

    private function errorLog(e:*):void {
        debug.updateLog(e + "\n");
    }

AS3连接以下单行PHP文件:

<?php file_put_contents($_POST['location'] . $_POST['fileName'], base64_decode($_POST['fileData']));

当我在我的Mac上运行SWF时,输出如下: 记录开始 [事件类型=“打开”bubbles = false cancelable = false eventPhase = 2] [ProgressEvent type =“progress”bubbles = false cancelable = false eventPhase = 2 bytesLoaded = 7 bytesTotal = 0] [HTTPStatusEvent type =“httpStatus”bubbles = false cancelable = false eventPhase = 2 status = 200 responseURL = null] [事件类型=“完成”bubbles = false cancelable = false eventPhase = 2]

在Windows上我得到以下输出: 记录开始 [HTTPStatusEvent type =“httpStatus”bubbles = false cancelable = false eventPhase = 2 status = 0 responseURL = null] [SecurityErrorEvent type =“securityError”bubbles = false cancelable = false eventPhase = 2 text =“Error#2048”]

对此的任何想法将不胜感激。我自己的猜测是文件权限,但是什么?

提前致谢!

[编辑] 它变得更有趣。 1.当我将整个项目移动到另一台服务器时,我在Windows和Mac上获得了#2048。 2.如果我将文件权限更改为777,我在Windows和Mac上也会获得#2048。

1 个答案:

答案 0 :(得分:1)

最后!我找到了。

将crossdomain.xml添加到我的网络服务器的根目录解决了这个问题。 这对我来说似乎很奇怪,因为我访问的php文件位于同一台服务器上,这解决了这个问题。不仅如此,它还在同一个文件夹中!

似乎在MAC OSX下,flashplayer识别出请求在同一个域内但在Windows下无法执行此操作。这可以解释为什么在Windows下安装错误。这导致我的瑞士法郎在MAC下工作但不在Windows机器上工作。现在我已将以下crossdomain.xml文件添加到我的服务器的根目录:

<?xml version="1.0" ?>

<cross-domain-policy>
    <site-control permitted-cross-domain-policies="master-only"/>
    <allow-access-from domain="*.mydomain.com" to-ports="*"/>
    <allow-http-request-headers-from domain="*.mydomain.com" headers="*"/>
</cross-domain-policy>

如果您想使用此解决方案,请将“mydomain.com”更改为您要允许的特定域。阅读有关crossdomain.xml的所有内容以及如何在此处使用它:http://learn.adobe.com/wiki/download/attachments/64389123/CrossDomain_PolicyFile_Specification.pdf?version=1

正如我在问题中所述,发现了以下错误:[SecurityErrorEvent type =“securityError”bubbles = false cancelable = false eventPhase = 2 text =“Error#2048”]

请注意,错误通常包含:[SecurityErrorEvent type =“securityError”bubbles = false cancelable = false eventPhase = 2 text =“错误#2048:安全沙箱违规:http://www.domain1.com/file.swf无法从{{3}加载数据}}。*“]

我的案例中缺少部分错误的事实可能表明请求了同一域中的文件。

所以crossdomain.xml就行了! 我希望这个答案对某人有益。

快乐的编码!