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
(Visual FoxPro) OneDrive -- Upload Large Files with an Upload SessionSee more OneDrive ExamplesDemonstrates how to upload large files with an upload session. See OneDrive Upload Session for more general information. Note: This example requires Chilkat v9.5.0.97 or greater.
LOCAL lnSuccess LOCAL loJson LOCAL loHttp LOCAL lcUrl LOCAL loResp LOCAL loJsonSession LOCAL lnFragSize LOCAL lcLocalFilePath LOCAL loFac LOCAL lnFileSize LOCAL lnNumFragments LOCAL i LOCAL loUploadUrl LOCAL loReq LOCAL loSbOffset LOCAL loSbNumBytes LOCAL loSbRange LOCAL lnBytesRemaining LOCAL lnChunkSize LOCAL lnExpectedStatusCode LOCAL lnNumReplaced * This example requires the Chilkat API to have been previously unlocked. * See Global Unlock Sample for sample code. * This example uses the OAuth client credentials flow. * See How to Create an Azure App Registration for OAuth 2.0 Client Credentials * Use your client ID, client secret, and tenant ID in the following lines * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.JsonObject') loJson = CreateObject('Chilkat.JsonObject') loJson.UpdateString("client_id","2871da2c-8176-4b7f-869b-2311aa82e743") loJson.UpdateString("client_secret","2hu9Q~r5QuryUcEkNbg1btLtnfU1VUXzhSCG6brH") loJson.UpdateString("scope","https://graph.microsoft.com/.default") loJson.UpdateString("token_endpoint","https://login.microsoftonline.com/114d7ed6-71bf-4dbe-a866-748364121bf2/oauth2/v2.0/token") * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.Http') loHttp = CreateObject('Chilkat.Http') loHttp.AuthToken = loJson.Emit() * ---------------------------------------------------------------------------- * Step 1: Create an upload session * To begin a large file upload, your app must first request a new upload session. This creates a * temporary storage location where the bytes of the file will be saved until the complete file is uploaded. * Once the last byte of the file has been uploaded the upload session is completed and the final file is shown * in the destination folder. * Send the following POST to create an upload session: * If not using "me", then the path should be /v1.0/users/{id | userPrincipalName}/... * POST /v1.0/users/{user_id}/drive/root:/{path_to_item}:/createUploadSession loHttp.SetUrlVar("path_to_item","/somefolder/big.zip") loHttp.SetUrlVar("user_id","4fe732c3-322e-4a6b-b729-2fd1eb5c6104") lcUrl = "https://graph.microsoft.com/v1.0/users/{$user_id}/drive/root:/{$path_to_item}:/createUploadSession" loResp = loHttp.PostJson2(lcUrl,"application/json","{}") IF (loHttp.LastMethodSuccess <> 1) THEN ? loHttp.LastErrorText RELEASE loJson RELEASE loHttp CANCEL ENDIF * If successful, a 200 status code is returned, with the session details (in JSON format). * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.JsonObject') loJsonSession = CreateObject('Chilkat.JsonObject') loJsonSession.EmitCompact = 0 loJsonSession.Load(loResp.BodyStr) IF (loResp.StatusCode <> 200) THEN ? loJsonSession.Emit() ? "Response status = " + STR(loResp.StatusCode) RELEASE loResp RELEASE loJson RELEASE loHttp RELEASE loJsonSession CANCEL ENDIF RELEASE loResp ? loJsonSession.Emit() * A sample response: * { * "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.uploadSession", * "uploadUrl": "https://api.onedrive.com/rup/3a33fceb9b74cc15/eyJSZXNvdXJjZUlEI ... 65yDYUiS3JTDnnhqCHxw", * "expirationDateTime": "2017-06-11T12:40:23.239Z", * "nextExpectedRanges": [ * "0-" * ] * } * * ---------------------------------------------------------------------------- * Step 2: Upload Data in Segments (a.k.a. Fragments or Chunks) * Microsoft states this requirement: Use a fragment size that is a multiple of 320 KiB (320 * 1024 bytes). * Failing to use a fragment size that is a multiple of 320 KiB can result in large file transfers failing after the * last fragment is uploaded. (Note: This is a detail imposed by Microsoft's OneDrive server-side implementation.) lnFragSize = 320 * 1024 lcLocalFilePath = "qa_data/zips/big.zip" * Upload the file big.zip in 320KiB segments. * 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. * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.FileAccess') loFac = CreateObject('Chilkat.FileAccess') lnFileSize = loFac.FileSize(lcLocalFilePath) * Open the file to get the number of fragments. lnSuccess = loFac.OpenForRead(lcLocalFilePath) IF (lnSuccess = 0) THEN ? loFac.LastErrorText RELEASE loJson RELEASE loHttp RELEASE loJsonSession RELEASE loFac CANCEL ENDIF lnNumFragments = loFac.GetNumBlocks(lnFragSize) loFac.FileClose() i = 0 ? "fileSize = " + STR(lnFileSize) ? "numFragments = " + STR(lnNumFragments) * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.Url') loUploadUrl = CreateObject('Chilkat.Url') loUploadUrl.ParseUrl(loJsonSession.StringOf("uploadUrl")) loJson.EmitCompact = 0 * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.HttpRequest') loReq = CreateObject('Chilkat.HttpRequest') loReq.HttpVerb = "PUT" loReq.Path = loUploadUrl.PathWithQueryParams loReq.ContentType = "application/octet-stream" * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.StringBuilder') loSbOffset = CreateObject('Chilkat.StringBuilder') * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.StringBuilder') loSbNumBytes = CreateObject('Chilkat.StringBuilder') * For versions of Chilkat < 10.0.0, use CreateObject('Chilkat_9_5_0.StringBuilder') loSbRange = CreateObject('Chilkat.StringBuilder') * IMPORTANT: The uploadUrl is a temporary URL to be used to upload the fragment. * It requires no authentication (because the URL itself could only have been obtained from an authenticated * request to start the upload session). Therefore, do not allow the upload URL to be publicly seen, * otherwise anybody could upload to your OneDrive. loHttp.AuthToken = "" lnBytesRemaining = lnFileSize DO WHILE i < lnNumFragments * The success response code for intermediate chunks is 202, * whereas the final chunk will have a 201 success response where * the response body is the JSON DriveItem. lnChunkSize = lnFragSize lnExpectedStatusCode = 202 IF (lnBytesRemaining < lnChunkSize) THEN lnChunkSize = lnBytesRemaining lnExpectedStatusCode = 201 ENDIF ? " this chunkSize = " + STR(lnChunkSize) * Indicate the fragment in the local file to be streamed in the upload. loSbOffset.Clear() loSbOffset.AppendInt(i * lnFragSize) loSbNumBytes.Clear() loSbNumBytes.AppendInt(lnChunkSize) loReq.StreamChunkFromFile(lcLocalFilePath,loSbOffset.GetAsString(),loSbNumBytes.GetAsString()) * The Content-Range header field must be set for this fragment. For example: * Content-Range: bytes 0-25/128 loSbRange.SetString("bytes start-end/fileSize") lnNumReplaced = loSbRange.ReplaceI("start",i * lnFragSize) lnNumReplaced = loSbRange.ReplaceI("end",i * lnFragSize + lnChunkSize - 1) lnNumReplaced = loSbRange.ReplaceI("fileSize",lnFileSize) loReq.AddHeader("Content-Range",loSbRange.GetAsString()) ? " this content-range: " + loSbRange.GetAsString() loResp = loHttp.SynchronousRequest(loUploadUrl.Host,443,1,loReq) IF (loHttp.LastMethodSuccess <> 1) THEN ? loHttp.LastErrorText RELEASE loJson RELEASE loHttp RELEASE loJsonSession RELEASE loFac RELEASE loUploadUrl RELEASE loReq RELEASE loSbOffset RELEASE loSbNumBytes RELEASE loSbRange CANCEL ENDIF loJson.Load(loResp.BodyStr) * A 202 response status code indicates success. IF (loResp.StatusCode <> lnExpectedStatusCode) THEN ? loJson.Emit() ? "Response status = " + STR(loResp.StatusCode) RELEASE loResp RELEASE loJson RELEASE loHttp RELEASE loJsonSession RELEASE loFac RELEASE loUploadUrl RELEASE loReq RELEASE loSbOffset RELEASE loSbNumBytes RELEASE loSbRange CANCEL ENDIF RELEASE loResp ? loJson.Emit() ? "---- Chunk " + STR(i) + " uploaded ----" lnBytesRemaining = lnBytesRemaining - lnChunkSize i = i + 1 ENDDO ? "data uploaded." * ---------------------------------------------------------------------------- * Sample output for the above session: * { * "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.uploadSession", * "uploadUrl": "https://api.onedrive.com/rup/3a33fceb9b74cc15/eyJSZXNvd ... QoKK2iuh1A", * "expirationDateTime": "2017-06-11T14:04:45.438Z", * "nextExpectedRanges": [ * "0-" * ] * } * * fileSize = 1366807 * numFragments = 5 * this chunkSize = 327680 * this content-range: bytes 0-327679/1366807 * { * "expirationDateTime": "2017-06-11T14:04:45.438Z", * "nextExpectedRanges": [ * "327680-1366806" * ] * } * * ---- Chunk 0 uploaded ---- * this chunkSize = 327680 * this content-range: bytes 327680-655359/1366807 * { * "expirationDateTime": "2017-06-11T14:04:45.438Z", * "nextExpectedRanges": [ * "655360-1366806" * ] * } * * ---- Chunk 1 uploaded ---- * this chunkSize = 327680 * this content-range: bytes 655360-983039/1366807 * { * "expirationDateTime": "2017-06-11T14:04:45.438Z", * "nextExpectedRanges": [ * "983040-1366806" * ] * } * * ---- Chunk 2 uploaded ---- * this chunkSize = 327680 * this content-range: bytes 983040-1310719/1366807 * { * "expirationDateTime": "2017-06-11T14:04:45.438Z", * "nextExpectedRanges": [ * "1310720-1366806" * ] * } * * ---- Chunk 3 uploaded ---- * this chunkSize = 56087 * this content-range: bytes 1310720-1366806/1366807 * { * "createdBy": { * "application": { * "displayName": "Chilkat", * "id": "441c9990" * }, * "user": { * "id": "3a33fceb9b74cc15" * } * }, * "createdDateTime": "2017-06-04T14:04:47.247Z", * "cTag": "aYzozQTMzRkNFQjlCNzRDQzE1ITQ4NjguMjU3", * "eTag": "aM0EzM0ZDRUI5Qjc0Q0MxNSE0ODY4LjA", * "id": "3A33FCEB9B74CC15!4868", * "lastModifiedBy": { * "application": { * "displayName": "Chilkat", * "id": "441c9990" * }, * "user": { * "id": "3a33fceb9b74cc15" * } * }, * "lastModifiedDateTime": "2017-06-04T14:04:47.247Z", * "name": "big.zip", * "parentReference": { * "driveId": "3a33fceb9b74cc15", * "id": "3A33FCEB9B74CC15!4862", * "name": "someFolder", * "path": "/drive/root:/someFolder" * }, * "size": 1366807, * "webUrl": "https://1drv.ms/u/s!ABXMdJvr_DM6pgQ", * "file": { * "hashes": { * "sha1Hash": "252059AA13004220DB912B97D4D3FF9599CCD8D9" * }, * "mimeType": "application/zip" * }, * "fileSystemInfo": { * "createdDateTime": "2017-06-04T14:04:47.246Z", * "lastModifiedDateTime": "2017-06-04T14:04:47.246Z" * }, * "tags": [ * ], * "lenses": [ * ] * } * * Response status = 201 RELEASE loJson RELEASE loHttp RELEASE loJsonSession RELEASE loFac RELEASE loUploadUrl RELEASE loReq RELEASE loSbOffset RELEASE loSbNumBytes RELEASE loSbRange |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.