0 Replies Latest reply on Apr 25, 2012 12:31 PM by Flex FTP Project

    Need help with an Adobe AIR app I have completed in Flex to FTP files??

    Flex FTP Project

      Hi All,

       

      Background: I am a newbie to Flex development and am trying to development an Adobe AIR desktop application that will connect to an FTP site and allow me to select a local file from my machine and upload it to the FTP site.

       

      I am using Flex Builder 4.6 to develop and test the application. The application has no errors but when the app initialises it gets an FTP ready response (code 220) from my FTP server however is not logging into the site using the username and password I have hard coded into the code.

       

      I have spent hours and hours now trying to get this working and thought it was time to speak to the professionals in Flex, my question Is, is there any chance one of you could look at my code below and point me in the right direction as to why i can connect to the FTP site but it is not logging in using the s.writeUTFBytes commands??

       

      CODE BELOW:

       

      <?xml version="1.0" encoding="utf-8"?>
      <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" initialize="upLoad()"
              xmlns:s="library://ns.adobe.com/flex/spark"
              xmlns:mx="library://ns.adobe.com/flex/mx"
              height="665" title="FTP Utility">

      <fx:Script>

        <![CDATA[ 
       
        import mx.controls.Alert;
        import mx.utils.*; 
       
        private var fileRef:FileReference;
        private var fileSize:uint;
        private var fileContents:ByteArray;

        //you need to initiate two sockets 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 ftpResponse:String;
        private var serverResponse:Number;
       
        //socket for sending Data to FTP
        private var dataChannelSocket:Socket;
       
        //responce from FTP when sending Data to FTP
        private var dataResponse:String;
       
        //will hold the IP address of the new socket created by FTP
        private var dataChannelIP:String = "IP of FTP Server"; //Should this be the IP of the FTP server or my local machine???
       
        //will hold the Port number created by FTP
        private var dataChannelPort:int = 21;
        private var user:String="my username";//FTP username
        private var pass:String="my password";//FTP Password 
        
        
        private function receiveReply(e:ProgressEvent):void {
        
         ftpResponse = s.readUTFBytes(s.bytesAvailable)
         var serverResponse:Number = Number(ftpResponse.substr(0, 3));
         
          if(ftpResponse.indexOf("227")>-1) {
         
           //get the ip from the string response (all commented out as I have the IP and port hard coded for testing purposes
           /*var temp:Object = ftpResponse.substring(ftpResponse.indexOf("(")+1,ftpResponse.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
            /* s.writeUTFBytes("USER "+user+"\n");
            s.flush(); */
           break;
         
           case "331" :
           //User name okay, need password
            /* s.writeUTFBytes("PASS "+pass+"\n");
            s.flush(); */
           break;
         
           case  "230":
           //User  logged in
            /* s.writeUTFBytes("CWD \n");
            s.flush(); */
           break;
          
           case "227" :
           //Entering Passive Mode
            /* s.writeUTFBytes("PASV \n");
            s.flush(); */
           break;
           default:
          } 
          traceData(ftpResponse);
        }
       
        private function receiveData(e:ProgressEvent):void {
       
         dataResponse = dataChannelSocket.readUTFBytes(
         dataChannelSocket.bytesAvailable);
         traceData("dataChannelSocket_response—>"+dataResponse);
        }
       
        private function showError(e:IOErrorEvent):void {
         traceData("Error—>"+e.text);
        }
       
        private function showSecError(e:SecurityErrorEvent):void {
         traceData("SecurityError–>"+e.text);
        } 
       
        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 = new Socket(dataChannelIP,dataChannelPort);
         dataChannelSocket.addEventListener(ProgressEvent.SOCKET_DATA, receiveData);
         dataChannelSocket.writeBytes(fileContents,0,fileSize);
         dataChannelSocket.flush();
        
        }
       
        private function upLoad():void {

         fileRef = new FileReference();
        
         //some eventlistener
         fileRef.addEventListener(Event.SELECT, selectEvent);
         fileRef.addEventListener(Event.OPEN, onFileOpen); 
       
         //this function connect to the ftp server
         connect();

         //send the username and password
         this.userName(user);
         this.passWord(pass);
         
         //if you want to change the directory for upload file
         /* this.changeDirectory("//default dir"); *///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);
         /* Alert.show(fileRef.name) */
         sendData(); 

        }

        private function connect():void{

         s = new Socket("ftp.mydomain.com",21);//Socket("ftp.anydomain.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 {
       
        }
       
        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();

        }
      ]]>
      </fx:Script>

      <mx:Panel id="up" horizontalAlign="left" width="100%" height="100%">
        <mx:Box width="100%" height="100%">
         <mx:VBox >
          <mx:Form  width="449" height="284">
           <mx:FormItem label="Selected File:">  
            <mx:Label id="filename"/>
           </mx:FormItem>
           <mx:FormItem >
            <mx:Button width="80" label="Browse" click="fileRef.browse()" />
            <mx:Button width="80" label="Upload" id="btn_upload" enabled="false"
                 click="uploadFile()" />
            <mx:Button width="80" label="Cancel" id="btn_cancel" enabled="false"
                 click="fileRef.cancel()" />
           </mx:FormItem> 
           <mx:HRule width="100%" tabEnabled="false"/>
           <mx:FormItem label="Events:">
            <mx:TextArea id="ta" width="260" height="98" />
           </mx:FormItem>
          </mx:Form> 
         </mx:VBox>
        </mx:Box>
      </mx:Panel>

      </WindowedApplication>

       


      FTP Logs.jpg