在将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。
答案 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就行了! 我希望这个答案对某人有益。
快乐的编码!