2010-02-18 7 views
1

Comment utiliser crossdomain avec ftp? J'essaie de faire un test de niveau «bonjour monde» de FTP dans Flex, mais depuis trois jours, je ne peux pas surmonter le problème avec la façon de contraindre Flex à accepter ma politique crossdomain - même à des fins de test. Voici mon code: Le texte exact de l'erreur suit.Fichier Flex Crossdomain.xml et FTP

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="onInitialize()" layout="vertical"> 

<mx:Script> 
<![CDATA[ 
    import mx.utils.*; 
    import mx.controls.Alert; 
    private var fileRef:FileReference; 
    private var fileSize:uint; 
    private var fileContents:ByteArray; 
    //you need to initiate two scokets one for sending 
    //commands and second for sending data to FTP Server 
    //socket for sending commands to FTP 
    private var s:Socket 
    //responce from FTP 
    private var ftpResponce:String; 
    //socket for sending Data to FTP 
    private var dataChannelSocket:Socket; 
    //responce from FTP when sending Data to FTP 
    private var dataResponce:String; 
    //will hold the IP address of new socket created by FTP 
    private var dataChannelIP:String; 
    //will hold the Port number created by FTP 
    private var dataChannelPort:int; 
    private var user:String="I have the right user"; //FTP usernae 
    private var pass:String="the pw is correct"; //FTP Password 

    private function receiveReply(e:ProgressEvent):void { 
    ftpResponce=s.readUTFBytes(s.bytesAvailable) 
    var serverResponse:Number=Number(ftpResponce.substr(0, 3)); 
    if (ftpResponce.indexOf('227') > -1) { 
     //get the ip from the string response 
     var temp:Object=ftpResponce.substring(ftpResponce.indexOf("(") + 1 
     , ftpResponce.indexOf(")")); 
     var dataChannelSocket_temp:Object=temp.split(","); 
     dataChannelIP=dataChannelSocket_temp.slice(0, 4).join("."); 
     dataChannelPort=parseInt(dataChannelSocket_temp[4]) * 256 + 
     int(dataChannelSocket_temp[5]); 
     //create new Data Socket based on dataChannelSocket and dataChannelSocket port 
     dataChannelSocket=new Socket(dataChannelIP, dataChannelPort); 
     dataChannelSocket.addEventListener(ProgressEvent.SOCKET_DATA, receiveData); 
    } 
    //few FTP Responce Codes 
    switch (String(serverResponse)) { 
     case "220": 
     //FTP Server ready responce 
     break; 
     case "331": 
     //User name okay, need password 
     break; 
     case "230": 
     //User logged in 
     break; 
     case "250": 
     //CWD command successful 
     break; 
     case "227": 
     //Entering Passive Mode (h1,h2,h3,h4,p1,p2). 
     break; 
     default: 
    } 
    //for more please 
    //http://http://www.altools.com/image/support/alftp/ALFTP_35_help/ 
    //FTP_response_codes_rfc_959_messages.htm   
    traceData(ftpResponce); 
    } 

    private function receiveData(e:ProgressEvent):void { 
    dataResponce=dataChannelSocket.readUTFBytes(
     dataChannelSocket.bytesAvailable); 
    traceData("dataChannelSocket_response—>" + dataResponce); 
    } 

    private function showError(e:IOErrorEvent):void { 
    traceData("Error—>" + e.text); 
    } 

    private function showSecError(e:SecurityErrorEvent):void { 
    traceData("SecurityError–>" + e.text); 
    } 

    private function onInitialize():void { 
    Security.loadPolicyFile("http://www.myUrlIsCorrectInMyProgram.com/crossdomain.xml"); 
    } 

    private function createRemoteFile(fileName:String):void { 
    if (fileName != null && fileName != "") { 
     s.writeUTFBytes("STOR " + fileName + "\n"); 
     s.flush(); 
    } 
    } 

    private function sendData():void { 
    fileContents=fileRef.data as ByteArray; 
    fileSize=fileRef.size; 
    dataChannelSocket.writeBytes(fileContents, 0, fileSize); 
    dataChannelSocket.flush(); 
    } 

    //initialize when application load 
    private function upLoad():void { 
    fileRef=new FileReference(); 
    //some eventlistener 
    fileRef.addEventListener(Event.SELECT, selectEvent); 
    fileRef.addEventListener(Event.OPEN, onFileOpen); 
    //this function connects to the ftp server 
    connect(); 
    //send the usernae and password 
    this.userName(user); 
    this.passWord(pass); 
    //if you want to change the directory for upload file 
    this.changeDirectory("/test/"); //directory name 
    //enter into PASSV Mode 
    s.writeUTFBytes("PASV\n"); 
    s.flush(); 
    } 

    private function onFileOpen(event:Event):void { 
    } 

    private function traceData(event:Object):void { 
    var tmp:String="================================\n"; 
    ta.text+=event.toString() + "\n"; 
    ta.verticalScrollPosition+=20; 
    } 

    private function ioErrorEvent(event:IOErrorEvent):void { 
    Alert.show("IOError:" + event.text); 
    } 

    private function selectEvent(event:Event):void { 
    btn_upload.enabled=true; 
    filename.text=fileRef.name; 
    fileRef.load(); 
    } 

    private function uploadFile():void { 
    createRemoteFile(fileRef.name); 
    sendData(); 
    } 

    private function connect():void { 
    s=new Socket("ftp.myUrlIsCorrectInMyProgram.com", 21); 
    s.addEventListener(ProgressEvent.SOCKET_DATA, receiveReply); 
    s.addEventListener(IOErrorEvent.IO_ERROR, showError); 
    s.addEventListener(SecurityErrorEvent.SECURITY_ERROR, showSecError); 
    s.addEventListener(Event.CONNECT, onSocketConnect); 
    s.addEventListener(Event.CLOSE, onSocketClose); 
    s.addEventListener(Event.ACTIVATE, onSocketAtivate); 
    } 

    private function onSocketConnect(evt:Event):void { 
    //traceData("OnSocketConnect–>"+evt.target.toString()); 
    } 

    private function onSocketClose(evt:Event):void { 
    //traceData("onSocketClose–>"+evt.target.toString()); 
    } 

    private function onSocketAtivate(evt:Event):void { 
    //traceData("onSocketAtivate–>"+evt.target.toString()); 
    } 

    private function userName(str:String):void { 
    sendCommand("USER " + str); 
    } 

    private function passWord(str:String):void { 
    sendCommand("PASS " + str); 
    } 

    private function changeDirectory(str:String):void { 
    sendCommand("CWD " + str); 
    } 

    private function sendCommand(arg:String):void { 
    arg+="\n"; 
    s.writeUTFBytes(arg); 
    s.flush(); 
    } 
]]> 

[SWF] /FTP-debug/FTP.swf - 739,099 octets après la décompression Avertissement: Le domaine www.myUrlIsCorrectInMyProgram.com ne spécifie pas de méta-politique. Appliquer la méta-politique par défaut «maître uniquement». Cette configuration est obsolète. Voir http://www.adobe.com/go/strict_policy_files pour résoudre ce problème.

Avertissement: Timeout sur xmlsocket: //ftp.myUrlIsCorrectInMyProgram.com: 843 (à 3 secondes) en attendant le fichier de stratégie de socket. Cela ne devrait pas causer de problèmes, mais voir http://www.adobe.com/go/strict_policy_files pour une explication.

Avertissement: [strict] Ignorer le fichier de stratégie sur xmlsocket: //ftp.myUrlIsCorrectInMyProgram.com: 21 en raison d'une syntaxe incorrecte. Voir http://www.adobe.com/go/strict_policy_files pour résoudre ce problème.

* Sécurité Sandbox Violation * Connexion à ftp.myUrlIsCorrectInMyProgram.com:21 interrompue - pas permis de http://localhost/FTP-debug/FTP.swf Erreur: Demande de ressources à xmlsocket: //ftp.myUrlIsCorrectInMyProgram.com: 21 par http://localhost/FTP-debug/FTP.swf est de demandeur refusé en raison de l'absence d'autorisations de fichier de stratégie.

Les «informations» aux URL énumérées ci-dessus sont catégoriquement inintelligibles pour moi.

S'il vous plaît, quelqu'un d'aide!

+0

Avez-vous réussi à faire fonctionner votre client FTP? J'essaie de faire quelque chose de similaire, mais j'ai des problèmes quand vient le temps d'ouvrir un socket en mode passif (voir ma question sur le sujet). – Zak

Répondre

1

J'ai également eu le même problème mais j'ai été en mesure de le réparer en utilisant le serveur de politique flash que j'ai téléchargé de http://www.flash-resources.net/download.html. J'ai couru ceci sur la même machine que j'ai mon serveur de tomcat installé et fait l'appel Security.loadPolicyFile ("xmlsocket: //: 843"); de l'application et cela a fonctionné parfaitement. Pas d'erreurs

1

J'ai également eu le même problème, mais j'ai été en mesure de le réparer en utilisant le serveur de politique flash que j'ai téléchargé de here. J'ai couru ceci sur la même machine que j'ai mon serveur de tomcat installé et fait l'appel sécurité.loadPolicyFile ("xmlsocket: // nom de la machine: 843"); de l'application et cela a fonctionné parfaitement. Pas d'erreurs

Regardez la faute de frappe autour du nom de la machine dans le dernier message.