PureBasic
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
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