使用URLLoader将文件从AS3写入PHP时的HttpStatus 0
我在AS3中做一个项目,用户可以设计一些东西,然后订购。设计将导出为PDF、PNG和XML格式。这些文件是我想保存在服务器上的。在MAMP上一切正常,我得到了HTTPStatus 200,请注意,我从MAMP运行了我的SWF,但是php脚本在远程服务器上成功访问,并且文件也成功写入远程服务器。但是,当我将SWF复制到远程服务器时,文件不会保存,我会得到一个HTTPStatus 0 在我使用的类中(参见下面的AS3代码),我使用URLLoader获得以下一行php脚本:使用URLLoader将文件从AS3写入PHP时的HttpStatus 0,php,actionscript-3,Php,Actionscript 3,我在AS3中做一个项目,用户可以设计一些东西,然后订购。设计将导出为PDF、PNG和XML格式。这些文件是我想保存在服务器上的。在MAMP上一切正常,我得到了HTTPStatus 200,请注意,我从MAMP运行了我的SWF,但是php脚本在远程服务器上成功访问,并且文件也成功写入远程服务器。但是,当我将SWF复制到远程服务器时,文件不会保存,我会得到一个HTTPStatus 0 在我使用的类中(参见下面的AS3代码),我使用URLLoader获得以下一行php脚本: <?php file
<?php file_put_contents($_POST['location'] . $_POST['fileName'], base64_decode($_POST['fileData']));
当我更改loader.load(请求)时;导航到URL(请求);代码确实有效。在本地和远程服务器上。显然,在这种情况下,我不能使用navigateToURL。我确实认为navigateToURL确实有效,loader.load(请求)并不能说明问题所在。。。但是什么呢
我被这件事缠住了,非常感谢你的帮助。
提前谢谢
PS:为了测试,我将远程目录的权限设置为777。此外,如前所述,文件已成功地从MAMP保存到远程。解决方案 经过长期研究,我找到了解决方案: 将以下crossdomain.xml添加到我的Web服务器(www.mysite.nl/)的根目录中 返回的错误如下:[SecurityErrorEvent type=“securityError”气泡=false cancelable=false eventPhase=2 text=“error#2048”] 请注意,通常错误包含:[SecurityErrorEvent type=“securityError”气泡=false cancelable=false eventPhase=2 text=“error#2048:安全沙盒冲突:无法从“]加载数据] 此错误通常通过加载安全策略来解决。查看此链接,了解如何使用安全策略: 但是,在这种情况下,访问的url位于同一个域中。(注意:相同的文件夹:D)所以最初我认为这是无关的,因为没有其他域联系。但在寻找了一个星期后,我变得如此绝望,我尝试了任何方法
因此,将crossdomain.xml添加到我的服务器根目录解决了问题。解决方案 经过长期研究,我找到了解决方案: 将以下crossdomain.xml添加到我的Web服务器(www.mysite.nl/)的根目录中 返回的错误如下:[SecurityErrorEvent type=“securityError”气泡=false cancelable=false eventPhase=2 text=“error#2048”] 请注意,通常错误包含:[SecurityErrorEvent type=“securityError”气泡=false cancelable=false eventPhase=2 text=“error#2048:安全沙盒冲突:无法从“]加载数据] 此错误通常通过加载安全策略来解决。查看此链接,了解如何使用安全策略: 但是,在这种情况下,访问的url位于同一个域中。(注意:相同的文件夹:D)所以最初我认为这是无关的,因为没有其他域联系。但在寻找了一个星期后,我变得如此绝望,我尝试了任何方法 因此,在服务器的根目录中添加一个crossdomain.xml解决了这个问题
public class ServerConnection extends Sprite
{
private var _files:Array = new Array();
private var _fileNames:Array;
private var _fileLocation:String = "";
private var _scriptLocation:String;
private var _fileSavesInProgress:Array = new Array();
public function ServerConnection(scriptLocation:String = null, files:Array = null, fileNames:Array = null)
{
if (scriptLocation) setScriptLocation(scriptLocation);
if (files) setFiles(files);
if (fileNames) setFileNames(fileNames);
}
public function encodeFiles():void {
for(var i:uint = 0; i < _files.length; i++) {
_files[i] = encodeFile(_files[i]);
}
}
public function encodeFile(byteArray:ByteArray):Base64Encoder {
var base64:Base64Encoder = new Base64Encoder();
base64.encodeBytes(byteArray);
return base64;
}
public function saveFiles(location:String = null):void {
if (location) setFileLocation(location);
for(var i:uint = 0; i < _files.length; i++) {
_files[i] = saveFile(_files[i], _fileNames[i]);
}
}
public function saveFile(encodedFile:Base64Encoder, fileName:String = "test"):void {
var data:URLVariables = new URLVariables();
data.fileData = encodedFile;
data.fileName = fileName;
data.location = _fileLocation;
this.dispatchEvent(new DebugEvent(DebugEvent.MESSAGE, "@serverConnection: a save file request was made for " +
fileName + "\n" +
"url: " + _fileLocation + "\n" +
" scriptLocation: " + _scriptLocation + "\n"
));
var request:URLRequest = new URLRequest(_scriptLocation);
request.method = URLRequestMethod.POST;
request.data = data;
var loader:URLLoader= new URLLoader();
loader.addEventListener(Event.COMPLETE, function(e:Event):void {fileSaved(loader);});
loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatus);
loader.addEventListener(IOErrorEvent.IO_ERROR, ioError);
_fileSavesInProgress.push(loader);
try {
loader.load(request);
} catch (e:*) {
this.dispatchEvent(new DebugEvent(DebugEvent.MESSAGE, "@serverConnection: error:* = " + e + " \n"));
}
//navigateToURL(request);
}
public function displayObjectToPNG(displayObject:*, scale:Number = 1):ByteArray {
var bmpData:BitmapData=new BitmapData(displayObject.width, displayObject.height, true, 0xFFFFFF);
bmpData.draw(displayObject);
var byteArray:ByteArray = PNGEncoder.encode(bmpData);
return byteArray;
}
public function xmlToByteArray(xml:XML):ByteArray {
var byteArray:ByteArray = new ByteArray();
byteArray.writeUTFBytes(xml);
return byteArray;
}
public function setScriptLocation(url:String):void {
_scriptLocation = url;
}
public function setFileLocation(url:String):void {
_fileLocation = url;
}
public function setFiles(array:Array, encode:Boolean = true):void {
for each(var file:* in array) {
for each(var type:XML in describeType(file).extendsClass.@type) {
if (type == "flash.display::DisplayObject") file = displayObjectToPNG(file);
}
if (typeof(file) == "xml") {
file = xmlToByteArray(file);
}
_files.push(file);
}
if (encode) encodeFiles();
}
public function setFileNames(array:Array):void {
_fileNames = array;
}
// EVENTS
private function httpStatus(e:HTTPStatusEvent):void {
this.dispatchEvent(new DebugEvent(DebugEvent.MESSAGE, "@serverConnection: status = " + e.status + " \n"));
}
private function ioError(e:IOErrorEvent):void {
this.dispatchEvent(new DebugEvent(DebugEvent.MESSAGE, "@serverConnection: IOErrorID = " + e.errorID + " Message: "+ e.text + " \n"));
}
private function fileSaved(loader:URLLoader):void {
this.dispatchEvent(new DebugEvent(DebugEvent.MESSAGE, "@serverConnection: file save completed. " + (_fileSavesInProgress.length -1) + " files to go \n"));
_fileSavesInProgress.splice(_fileSavesInProgress.indexOf(loader), 1);
if (_fileSavesInProgress.length == 0) {
filesSaved();
}
}
private function filesSaved():void {
this.dispatchEvent(new DebugEvent(DebugEvent.MESSAGE, "@serverConnection: files saved \n"));
this.dispatchEvent (new ClassAttributesLoaded(ClassAttributesLoaded.CLASS_ATTRIBUTES_LOADED));
}
}
var s:ServerConnection = new ServerConnection(
CONSTANT.SAVE_FILE_SCRIPT_LOCATION,
[currentTemplate.getXML(), exampleTemplate, pdf.save(Method.LOCAL)],
[CONSTANT.PACKAGE_ID + ".xml", CONSTANT.PACKAGE_ID + ".png", CONSTANT.PACKAGE_ID + ".pdf"]
);
s.addEventListener(DebugEvent.MESSAGE, writeToDebug);
s.addEventListener(ClassAttributesLoaded.CLASS_ATTRIBUTES_LOADED, exit);
s.saveFiles(CONSTANT.RELATIVE_FILE_DIRECTORY);
<?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>
loader.addEventListener(IOErrorEvent.IO_ERROR, handleSecurityError);