Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(Lianja) Azure File Service: Upload Large FileSample code to upload a large file to a directory in a share in the Azure File Service. A file is uploaded by first creating the file in the Azure share and then writing ranges of bytes to the file. Azure imposes a 4MB limit for each PUT to write a range. Files larger than 4MB need to be uploaded by making multiple "Put Range" calls. This example uploads a large file requiring multiple "Put Range" calls.
// Azure File Service Example: Upload a large file. // See: https://docs.microsoft.com/en-us/rest/api/storageservices/create-share // also see: https://docs.microsoft.com/en-us/rest/api/storageservices/put-range // This example requires the Chilkat API to have been previously unlocked. // See Global Unlock Sample for sample code. loRest = createobject("CkRest") // Connect to the Azure Storage Blob Service llBTls = .T. lnPort = 443 llBAutoReconnect = .T. // In this example, the storage account name is "chilkat". llSuccess = loRest.Connect("chilkat.file.core.windows.net",lnPort,llBTls,llBAutoReconnect) if (llSuccess <> .T.) then ? loRest.LastErrorText release loRest return endif // This example will upload a larger file. lcLocalFilePath = "qa_data/zips/somethingBig.zip" loFac = createobject("CkFileAccess") // Note: The FileSize method returns a signed 32-bit integer. If the file is potentially larger than 2GB, call FileSizeStr instead to return // the size of the file as a string, then convert to an integer value. lnSzLocalFile = loFac.FileSize(lcLocalFilePath) if (lnSzLocalFile < 0) then ? loFac.LastErrorText release loRest release loFac return endif // Provide Azure Cloud credentials for the REST calls. loAzAuth = createobject("CkAuthAzureStorage") loAzAuth.AccessKey = "AZURE_ACCESS_KEY" // The account name used here should match the 1st part of the domain passed in the call to Connect (above). loAzAuth.Account = "chilkat" loAzAuth.Scheme = "SharedKey" loAzAuth.Service = "File" // This causes the "x-ms-version: 2020-08-04" header to be automatically added. loAzAuth.XMsVersion = "2020-08-04" llSuccess = loRest.SetAuthAzureStorage(loAzAuth) // Note: The application does not need to explicitly set the following // headers: x-ms-date, Authorization. These headers // are automatically set by Chilkat. // However, a few additional headers are required for the "Create File" operation: loRest.AddHeader("x-ms-type","file") // This required header specifies the final size of the file (or the maximum size it can be). loSbFileSize = createobject("CkStringBuilder") loSbFileSize.AppendInt(lnSzLocalFile) loRest.AddHeader("x-ms-content-length",loSbFileSize.GetAsString()) // Send a PUT request to create the file (or replace the file if it already exists). // This will initialize the file in the Azure file storage. To upload content, we'll need // to do the "Put Range" operation one or more times. // The following will create the file "somethingBig.zip" in the share "pip" lcResponseStr = loRest.FullRequestNoBody("PUT","/pip/somethingBig.zip") if (loRest.LastMethodSuccess <> .T.) then ? loRest.LastErrorText release loRest release loFac release loAzAuth release loSbFileSize return endif // When successful, the Azure File Service will respond with a 201 (Created) response status code, // with no XML response body. If an error response is returned, there will be an XML response body. if (loRest.ResponseStatusCode <> 201) then // Examine the request/response to see what happened. ? "response status code = " + str(loRest.ResponseStatusCode) ? "response status text = " + loRest.ResponseStatusText ? "response header: " + loRest.ResponseHeader ? "response body (if any): " + lcResponseStr ? "---" ? "LastRequestStartLine: " + loRest.LastRequestStartLine ? "LastRequestHeader: " + loRest.LastRequestHeader release loRest release loFac release loAzAuth release loSbFileSize return endif ? "Successfully created somethingBig.zip" // -------------------------------------------------------------------------------- // Upload the file data... // Make sure the headers from the "Create File" operation are removed. loRest.ClearAllHeaders() // The x-ms-write header is required for each "Put Range" request. loRest.AddHeader("x-ms-write","update") loSbRange = createobject("CkStringBuilder") loSbResponseBody = createobject("CkStringBuilder") loBdFileData = createobject("CkBinData") // Open the file. We'll be reading and uploading in chunks.. llSuccess = loFac.OpenForRead(lcLocalFilePath) if (llSuccess <> .T.) then ? loFac.LastErrorText release loRest release loFac release loAzAuth release loSbFileSize release loSbRange release loSbResponseBody release loBdFileData return endif lnNumBytesLeft = lnSzLocalFile lnCurIndex = 0 do while lnNumBytesLeft > 0 lnChunkSize = lnNumBytesLeft // Azure allows for 4MB max chunks (4 x 1024 x 1024 = 4194304) if (lnChunkSize > 4194304) then lnChunkSize = 4194304 endif // The only tricky part here is to correctly add the x-ms-range header. // It will be formatted like this: // x-ms-range: bytes=0-759623 loSbRange.Clear() loSbRange.Append("bytes=") loSbRange.AppendInt(lnCurIndex) loSbRange.Append("-") loSbRange.AppendInt(lnCurIndex + lnChunkSize - 1) // This replaces the header if it already exists.. loRest.AddHeader("x-ms-range",loSbRange.GetAsString()) // Read the next chunk from the local file. loBdFileData.Clear() llSuccess = loFac.FileReadBd(lnChunkSize,loBdFileData) llSuccess = loRest.FullRequestBd("PUT","/pip/somethingBig.zip?comp=range",loBdFileData,loSbResponseBody) if (llSuccess <> .T.) then // This would indicate a failure where no response was received. ? loRest.LastErrorText release loRest release loFac release loAzAuth release loSbFileSize release loSbRange release loSbResponseBody release loBdFileData return endif // A 201 response indicates the chunk was uploaded. if (loRest.ResponseStatusCode <> 201) then // Examine the request/response to see what happened. ? "response status code = " + str(loRest.ResponseStatusCode) ? "response status text = " + loRest.ResponseStatusText ? "response header: " + loRest.ResponseHeader ? "response body (if any): " + lcResponseStr ? "---" ? "LastRequestStartLine: " + loRest.LastRequestStartLine ? "LastRequestHeader: " + loRest.LastRequestHeader release loRest release loFac release loAzAuth release loSbFileSize release loSbRange release loSbResponseBody release loBdFileData return endif ? "Uploaded chunk from " + str(lnCurIndex) + " to " + str(lnCurIndex + lnChunkSize - 1) lnCurIndex = lnCurIndex + lnChunkSize lnNumBytesLeft = lnNumBytesLeft - lnChunkSize enddo loFac.FileClose() ? "success." release loRest release loFac release loAzAuth release loSbFileSize release loSbRange release loSbResponseBody release loBdFileData |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.