Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用URLLoader将文件从AS3写入PHP时的HttpStatus 0_Php_Actionscript 3 - Fatal编程技术网

使用URLLoader将文件从AS3写入PHP时的HttpStatus 0

使用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

我在AS3中做一个项目,用户可以设计一些东西,然后订购。设计将导出为PDF、PNG和XML格式。这些文件是我想保存在服务器上的。在MAMP上一切正常,我得到了HTTPStatus 200,请注意,我从MAMP运行了我的SWF,但是php脚本在远程服务器上成功访问,并且文件也成功写入远程服务器。但是,当我将SWF复制到远程服务器时,文件不会保存,我会得到一个HTTPStatus 0

在我使用的类中(参见下面的AS3代码),我使用URLLoader获得以下一行php脚本:

<?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);