WriteFTPFile Method
Class: FTP_SERVICE
This method sends a file or string to the FTP server from some local area. Depending on how the FTP Server is setup, decides whether or not an existing file is overwritten or if the function fails to send the file.
=
Object.WriteFTPFile
Parameter
lcRemoteFile
Remote file name
Type Character
Direction Input
Name and Path for the contents of the file to be stored in.
This parameter cannot be empty.
lcData
Data or file name
Type Character
Direction Input
Data or file name which will be send to FTP server.
This parameter cannot be empty.
liData
Buffer size
Type Integer
Direction Input
Optional  
Buffer size for writing to FTP server.
liStart
Start position
Type Integer
Direction Input
Optional  
Start position for resume mode.
liFlags
Data or file name is source
Type Integer
Direction Input
Optional  
ValueDescription
_FTPS_RWF_File lcData must be file name.
_FTPS_RWF_String lcData must be string.
_FTPS_RWF_Resume Resume mode, default.
lnFlag
The flags that indicate various options.
Type Numeric
Direction Input
Value is combined with FTP_SERVICE::nCachingType's value and FTP_TRANSFER_TYPE_BINARY . Can be one of the following:
ValueDescription
FTP_TRANSFER_TYPE_ASCII Transfers the file as ASCII.
FTP_TRANSFER_TYPE_BINARY Transfers the file as binary.
Assumed from MSDN.
Return value Boolean
The return value is .T. if file is uploaded or .F. is not.
Example
LOCAL loFTP,lcPom
#INCLUDE "ftp.h"
SET PROCEDURE TO ftp.prg ADDITIVE 
loFTP=CREATEOBJECT('_myftp') 

IF loFTP.OpenInternet("ABONNE", "PWD", "10.10.10.10", "21")

   * Write remote file into bottom from local file
   IF loFTP.WriteFtpFile("any.txt","local.txt",1000)
      ?STRTRAN("File %File% uploaded","%File%","local.txt")
   ELSE
      ?loFTP.GetExtendedErrorCode(),loFTP.GetExtendedErrorMsg()
   ENDIF

   * Write remote file into 10. byte (resume mode) from local file
   IF loFTP.WriteFtpFile("any.txt","local.txt",1000,10)
      ?STRTRAN("File %File% uploaded","%File%","local.txt")
   ELSE
      ?loFTP.GetExtendedErrorCode(),loFTP.GetExtendedErrorMsg()
   ENDIF

   * Write remote file into bottom from string
   lcPom=FILETOSTR("local.txt")
   IF loFTP.WriteFtpFile("any.txt",@lcPom,1000,0,_FTPS_RWF_String)
      ?STRTRAN("File %File% uploaded","%File%","local.txt")
   ELSE
      ?loFTP.GetExtendedErrorCode(),loFTP.GetExtendedErrorMsg()
   ENDIF

   * Write remote file into 10. byte from string
   lcPom=FILETOSTR("local.txt")
   IF loFTP.WriteFtpFile("any.txt",@lcPom,1000,10,_FTPS_RWF_String)
      ?STRTRAN("File %File% uploaded","%File%","local.txt")
   ELSE
      ?loFTP.GetExtendedErrorCode(),loFTP.GetExtendedErrorMsg()
   ENDIF

   =loFTP.CloseInternet() 
ENDIF
RELEASE PROCEDURE ftp.prg

DEFINE CLASS _myFTP AS FTP_SERVICE
   PROCEDURE BeforeWriteFTPFile(lcRemoteFile, lcData,liData,liStart,liFlags,lnFlag)
      ?PROGRAM(16)
      ?CHR(9),lcRemoteFile, liData,liStart,liFlags
   ENDPROC

   PROCEDURE AfterWriteFTPFile(lcRemoteFile, lcData,liData,liStart,liFlags,lnFlag,fResult)
      ?PROGRAM(16)
      ?CHR(9),lcRemoteFile, liData,liStart,liFlags,fResult
   ENDPROC

   PROCEDURE AtWriteFTPFile(lcRemoteFile, lcData,liData,liStart,liFlags,lnFlag,lii,liWrite,fResult)
      ?PROGRAM(16)
      ?CHR(9),lcRemoteFile, lcData,liData,liStart,liFlags,lii,liWrite,fResult
   ENDPROC
ENDDEFINE 
See also
Expand/Collapse source code of procedure WriteFTPFile Source Code
      LPARAMETERS INP lcRemoteFile, INP lcData,OPT_INP liData,OPT_INP liStart,OPT_INP liFlags,OPT_INP lnFlag
      LOCAL fResult,lihFTP,lcBuffer,liData,liWrite,lihFile,llFast,lcAll
      LOCAL ARRAY laFile(1)
      lihFile=0

      liData=IIF(PCOUNT()<3,512,liData)
      liData=IIF(liData<=0,512,liData)

      liStart=IIF(PCOUNT()<4,0,liStart)
      liFlags=IIF(PCOUNT()<5,_FTPS_RWF_File,liFlags)
      lnFlag=IIF(PCOUNT()<6,0,lnFlag)

      IF !BITTEST(liFlags,0) && File?
         IF ADIR(laFile,lcData,"RSHA")=0
            RETURN .F.
         ENDIF

         llFast=VAL(STRTRAN(SUBS(VERSION(),LEN("Visual FoxPro ")+1,2),"0",""))>5 AND laFile(1,2)<=_FTPS_MaxFileSize
         IF !llFast
            lihFile=FOPEN(lcData,0)
            IF lihFile<=0
               RETURN .F.
            ENDIF
            =FSEEK(lihFile,liStart,0)
         ELSE
            lcAll=FILETOSTR(lcData)
            lcAll=SUBST(lcAll,liStart+1)
         ENDIF
      ELSE
         lcData=IIF(TYPE("lcData")#"C","",lcData)
         lcData=SUBST(lcData,liStart+1)
         llFast=.T.
      ENDIF

      IF This.OpenFTPConnection(This.cStartupFolder)    && Open an FTP Handle
         lcRemoteFile = lcRemoteFile + cNULL

         =This.BeforeWriteFTPFile(@lcRemoteFile, @lcData,liData,liStart,liFlags,lnFlag)

         IF liStart<=0 && All data
            STORE FtpOpenFile(This.nConnect_Handle, @lcRemoteFile, GENERIC_WRITE, ;
                              BITOR(FTP_TRANSFER_TYPE_BINARY,BITOR(This.nCachingType,lnFlag)), 0) TO fResult,lihFTP
            =This.GetExtendedError()
         ELSE
            * Append file
            fResult=IIF(This.FTPCommand("APPE "+lcRemoteFile, FTP_TRANSFER_TYPE_BINARY,0,@lihFTP),1,0)
         ENDIF

         IF fResult #0 && OK, FTP file is openned
            DO CASE
               CASE !BITTEST(liFlags,0) AND (laFile(1,2)=0 OR LEN(lcAll)=0) OR;
                     BITTEST(liFlags,0) AND LEN(lcData)=0 && prázndý soubor nebo prázdná data
                    lcBuffer=""
                    liData=LEN(lcBuffer)

                    liWrite=0
                    fResult = InternetWriteFile(lihFTP, @lcBuffer, liData, @liWrite)
                    =This.GetExtendedError()
                    =This.AtWriteFTPFile(@lcRemoteFile, @lcData,liData,liStart,liFlags,lnFlag,0,liWrite,fResult)
                    IF fResult#1
                       EXIT
                    ENDIF

               CASE llFast AND !BITTEST(liFlags,0) && File from string
                    lii=1

                    DO WHILE lii<LEN(lcAll)
                       lcBuffer=SUBST(lcAll,lii,liData)
                       liData=LEN(lcBuffer)

                       liWrite=0
                       fResult = InternetWriteFile(lihFTP, @lcBuffer, liData, @liWrite)
                       =This.GetExtendedError()
                       =This.AtWriteFTPFile(@lcRemoteFile, @lcData,liData,liStart,liFlags,lnFlag,lii,liWrite,fResult)
                       IF fResult#1
                          EXIT
                       ENDIF
                       lii=lii+liData
                    ENDDO

               CASE BITTEST(liFlags,0) && String data
                    lii=1

                    DO WHILE lii<LEN(lcData)
                       lcBuffer=SUBST(lcData,lii,liData)
                       liData=LEN(lcBuffer)

                       liWrite=0
                       fResult = InternetWriteFile(lihFTP, @lcBuffer, liData, @liWrite)
                       =This.GetExtendedError()
                       =This.AtWriteFTPFile(@lcRemoteFile, @lcData,liData,liStart,liFlags,lnFlag,lii,liWrite,fResult)
                       IF fResult#1
                          EXIT
                       ENDIF
                       lii=lii+liData
                    ENDDO

               OTHERWISE && File native
                    DO WHILE !FEOF(lihFile)
                       lcBuffer=FREAD(lihFile,liData)
                       liData=LEN(lcBuffer)

                       liWrite=0
                       fResult = InternetWriteFile(lihFTP, @lcBuffer, liData, @liWrite)
                       =This.GetExtendedError()
                       =This.AtWriteFTPFile(@lcRemoteFile, @lcData,liData,liStart,liFlags,lnFlag,FSEEK(lihFile,0,1),liWrite,fResult)
                       IF fResult#1
                          EXIT
                       ENDIF
                    ENDDO
                    =FCLOSE(lihFile)
            ENDCASE

            =IIF(liStart>0,This.FTPCommand("NOOP", FTP_TRANSFER_TYPE_BINARY,0,.NULL.),.T.)
            =InternetCloseHandle(lihFTP)
         ENDIF

         =This.AfterWriteFTPFile(@lcRemoteFile, @lcData,liData,liStart,liFlags,lnFlag,fResult)
         =IIF(This.lMultiOperations,.T.,This.CloseFTPConnection())   && Close FTP Handle
         RETURN fResult = 1
      ENDIF
      RETURN .F.