Sample code for 30+ languages & platforms
PureBasic

Streaming Download Large File to the Local Filesystem

See more Azure Cloud Storage Examples

Downloads a large file in a streaming fashion to the local filesystem.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkRest.pb"
IncludeFile "CkAuthAzureStorage.pb"
IncludeFile "CkStream.pb"

Procedure ChilkatExample()

    success.i = 0

    ; Azure File Service Example: Downloads a large file to the local filesystem using a Chilkat stream.
    ; See:  https://docs.microsoft.com/en-us/rest/api/storageservices/get-file

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

    rest.i = CkRest::ckCreate()
    If rest.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; Connect to the Azure Storage Blob Service
    bTls.i = 1
    port.i = 443
    bAutoReconnect.i = 1
    ; In this example, the storage account name is "chilkat".
    success = CkRest::ckConnect(rest,"chilkat.file.core.windows.net",port,bTls,bAutoReconnect)
    If success <> 1
        Debug CkRest::ckLastErrorText(rest)
        CkRest::ckDispose(rest)
        ProcedureReturn
    EndIf

    ; Provide Azure Cloud credentials for the REST calls.
    azAuth.i = CkAuthAzureStorage::ckCreate()
    If azAuth.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkAuthAzureStorage::setCkAccessKey(azAuth, "AZURE_ACCESS_KEY")
    ; The account name used here should match the 1st part of the domain passed in the call to Connect (above).
    CkAuthAzureStorage::setCkAccount(azAuth, "chilkat")
    CkAuthAzureStorage::setCkScheme(azAuth, "SharedKey")
    CkAuthAzureStorage::setCkService(azAuth, "File")
    ; This causes the "x-ms-version: 2021-08-06" header to be automatically added.
    CkAuthAzureStorage::setCkXMsVersion(azAuth, "2021-08-06")
    success = CkRest::ckSetAuthAzureStorage(rest,azAuth)

    ; Note: The application does not need to explicitly set the following
    ; headers: x-ms-date, Authorization.  These headers
    ; are automatically set by Chilkat.

    ; When streaming a download to the local filesystem or directed elsewhere,
    ; the complete HTTP GET operation must be broken into parts.
    ; For example, an HTTP GET consists of sending the request, followed by reading the response header,
    ; and then finally the response body.  We'll want to read the response header, and then based
    ; on the information received (such as success or failure), either read the response body
    ; as an error message, or as the file data.

    ; Send the HTTP GET request to download the file.
    ; The share is named "pip".
    success = CkRest::ckSendReqNoBody(rest,"GET","/pip/somethingBig.zip")
    If success <> 1
        Debug CkRest::ckLastErrorText(rest)
        CkRest::ckDispose(rest)
        CkAuthAzureStorage::ckDispose(azAuth)
        ProcedureReturn
    EndIf

    ; Read the response header.
    responseStatusCode.i = CkRest::ckReadResponseHeader(rest)
    If responseStatusCode < 0
        Debug CkRest::ckLastErrorText(rest)
        CkRest::ckDispose(rest)
        CkAuthAzureStorage::ckDispose(azAuth)
        ProcedureReturn
    EndIf

    Debug "Response status code = " + Str(responseStatusCode)

    ; We expect a 200 response status if the file data is coming.
    ; Otherwise, we'll get a string response body with an error message(or no response body).
    If responseStatusCode = 200

        bodyStream.i = CkStream::ckCreate()
        If bodyStream.i = 0
            Debug "Failed to create object."
            ProcedureReturn
        EndIf

        ; The stream's sink will be a file.
        CkStream::setCkSinkFile(bodyStream, "qa_output/somethingBig.zip")

        ; Read the response body to the stream.  Given that we've
        ; set the stream's sink to a file, it will stream directly
        ; to the file.
        success = CkRest::ckReadRespBodyStream(rest,bodyStream,1)
        If success <> 1
            Debug CkRest::ckLastErrorText(rest)
            CkRest::ckDispose(rest)
            CkAuthAzureStorage::ckDispose(azAuth)
            CkStream::ckDispose(bodyStream)
            ProcedureReturn
        EndIf

        Debug "Successfully received the large file."

    Else
        errResponse.s = CkRest::ckReadRespBodyString(rest)
        If CkRest::ckLastMethodSuccess(rest) <> 1
            Debug CkRest::ckLastErrorText(rest)
        Else
            Debug errResponse
        EndIf

    EndIf



    CkRest::ckDispose(rest)
    CkAuthAzureStorage::ckDispose(azAuth)
    CkStream::ckDispose(bodyStream)


    ProcedureReturn
EndProcedure