Sample code for 30+ languages & platforms
DataFlex

SFTP Upload Large File in Parts

See more SFTP Examples

Demonstrates how to split a large file into N parts and then upload each part separately. This technique can be used to potentially avoid limits a SFTP server might impose on upload file size.

Chilkat DataFlex Downloads

DataFlex
Use ChilkatAx-win32.pkg

Procedure Test
    Boolean iSuccess
    Handle hoSftp
    String sHostname
    Integer iPort
    String sHandle
    String sLocalFilePath
    Handle hoFac
    Integer iBlockSize
    Integer iNumBlocks
    Variant vBd
    Handle hoBd
    Integer i
    String sTemp1
    Boolean bTemp1

    Move False To iSuccess

    // This example assumes the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    Get Create (RefClass(cComChilkatSFtp)) To hoSftp
    If (Not(IsComObjectCreated(hoSftp))) Begin
        Send CreateComObject of hoSftp
    End

    // Set some timeouts, in milliseconds:
    Set ComConnectTimeoutMs Of hoSftp To 5000
    Set ComIdleTimeoutMs Of hoSftp To 10000

    // Connect to the SSH server.  
    // The standard SSH port = 22
    // The hostname may be a hostname or IP address.
    Move "sftp.example.com" To sHostname
    Move 22 To iPort
    Get ComConnect Of hoSftp sHostname iPort To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoSftp To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    // Authenticate with the SSH server.  Chilkat SFTP supports
    // both password-based authenication as well as public-key
    // authentication.  This example uses password authenication.
    Get ComAuthenticatePw Of hoSftp "myLogin" "myPassword" To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoSftp To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    // After authenticating, the SFTP subsystem must be initialized:
    Get ComInitializeSftp Of hoSftp To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoSftp To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    // Open a remote file for writing on the SSH server.
    // If the file already exists, it is overwritten.
    // (Specify "createNew" instead of "createTruncate" to
    // prevent overwriting existing files.)
    Get ComOpenFile Of hoSftp "big.zip" "writeOnly" "createTruncate" To sHandle
    Get ComLastMethodSuccess Of hoSftp To bTemp1
    If (bTemp1 <> True) Begin
        Get ComLastErrorText Of hoSftp To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    // We're going to upload the local file "qa_data/zips/big.zip" (a relative local path from our current working directory)
    // to the SFTP server.
    Move "qa_data/zips/big.zip" To sLocalFilePath

    // Rather than uploading in one shot, we'll read the local file in chunks
    // and upload a chunk at a time.
    Get Create (RefClass(cComCkFileAccess)) To hoFac
    If (Not(IsComObjectCreated(hoFac))) Begin
        Send CreateComObject of hoFac
    End

    Get ComOpenForRead Of hoFac sLocalFilePath To iSuccess
    If (iSuccess = False) Begin
        Get ComCloseHandle Of hoSftp sHandle To iSuccess
        Get ComLastErrorText Of hoFac To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    // If we were to split the local file into 128K chunks, how many chunks (blocks) would
    // we have, including the last partial block?
    Move 131072 To iBlockSize
    Get ComGetNumBlocks Of hoFac iBlockSize To iNumBlocks
    Showln "Number of blocks = " iNumBlocks

    Get Create (RefClass(cComChilkatBinData)) To hoBd
    If (Not(IsComObjectCreated(hoBd))) Begin
        Send CreateComObject of hoBd
    End
    Move 0 To i
    While (i < iNumBlocks)
        // Read the Nth block, which gets appended to the bd.  (which means
        // we must clear the contents of bd before the next iteration)
        Get pvComObject of hoBd to vBd
        Get ComReadBlockBd Of hoFac i iBlockSize vBd To iSuccess
        If (iSuccess = False) Begin
            Get ComCloseHandle Of hoSftp sHandle To iSuccess
            Get ComLastErrorText Of hoFac To sTemp1
            Showln sTemp1
            Procedure_Return
        End

        // Upload this block to the open remote file.
        Get pvComObject of hoBd to vBd
        Get ComWriteFileBd Of hoSftp sHandle vBd To iSuccess
        If (iSuccess = False) Begin
            Get ComLastErrorText Of hoSftp To sTemp1
            Showln sTemp1
            Procedure_Return
        End

        // Clear the contents for the next iteration.
        Get ComClear Of hoBd To iSuccess

        Move (i + 1) To i
    Loop

    // Close the local file.
    Send ComFileClose To hoFac

    // -----------------------------------------------------------------------------
    // This is important.  You must close the handle on the server.
    // Otherwise open handles will accumulate on the server until eventually a limit
    // is reached and the server will fail on a call to OpenFile.
    // -----------------------------------------------------------------------------

    // Close the remote file handle on the server.
    Get ComCloseHandle Of hoSftp sHandle To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoSftp To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Showln "Success."


End_Procedure