DataFlex Requires Chilkat v11.7.0+
DataFlex
Box: Upload a File from BinData
See more Box Examples
Run the reusable setup once per HttpCurl object, then select names and execute the operation. The setup is repeated here only to make this published example independently runnable. Resolve documents by name using HttpCurl, then upload a small local PDF from BinData with Rest. The transfer is explicit after dependency resolution; no ID is entered by the caller.
See the Box API guide for setup and the complete workflow.
Chilkat DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Handle hoCurl
Handle hoSetupCommand
Integer iSetupReplacements
String sParentName
String sFolderName
Handle hoAuthorizedCommand1
Integer iHeaderReplacement1
Variant vData
Handle hoData
Handle hoRest
Variant vOauth2
Handle hoOauth2
Handle hoAttributes
String sResponseBody
Handle hoResult
String sTemp1
Integer iTemp1
Boolean bTemp1
Move False To iSuccess
// Requires Chilkat 11.7.0 or later and a previously unlocked Chilkat bundle.
// See Global Unlock Sample.
// Guide: Box API Guide.
Move False To iSuccess
// BEGIN ONE-TIME SETUP
// This block is repeated so each published example can run on its own.
// In an application, run the setup example once and pass the SAME curl object
// to operation code below. Do not recreate it for every operation.
// See Reusable Box HttpCurl Setup.
Get Create (RefClass(cComChilkatHttpCurl)) To hoCurl
If (Not(IsComObjectCreated(hoCurl))) Begin
Send CreateComObject of hoCurl
End
Send ComSetVar To hoCurl "access_token" "BOX_ACCESS_TOKEN"
Send ComSetVar To hoCurl "parent_name" "/"
// Box's fixed root ID is an implementation detail; callers supply names.
Send ComSetVar To hoCurl "parent_id" "0"
Get Create (RefClass(cComChilkatStringBuilder)) To hoSetupCommand
If (Not(IsComObjectCreated(hoSetupCommand))) Begin
Send CreateComObject of hoSetupCommand
End
// Register findParent; registration sends no request.
Get ComSetString Of hoSetupCommand 'curl -X GET "https://api.box.com/2.0/folders/0/items?limit=1000&fields=id,type,name" -H "Authorization: Bearer ACCESS_TOKEN"' To iSuccess
Get ComGetVar Of hoCurl "access_token" To sTemp1
Get ComReplace Of hoSetupCommand "ACCESS_TOKEN" sTemp1 To iSetupReplacements
Get ComGetAsString Of hoSetupCommand To sTemp1
Get ComAddFunction Of hoCurl "findParent" sTemp1 To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
// Register findFolder; registration sends no request.
Get ComSetString Of hoSetupCommand 'curl -X GET "https://api.box.com/2.0/folders/{{parent_id}}/items?limit=1000&fields=id,type,name" -H "Authorization: Bearer ACCESS_TOKEN"' To iSuccess
Get ComGetVar Of hoCurl "access_token" To sTemp1
Get ComReplace Of hoSetupCommand "ACCESS_TOKEN" sTemp1 To iSetupReplacements
Get ComGetAsString Of hoSetupCommand To sTemp1
Get ComAddFunction Of hoCurl "findFolder" sTemp1 To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
// Register findFile; registration sends no request.
Get ComSetString Of hoSetupCommand 'curl -X GET "https://api.box.com/2.0/folders/{{folder_id}}/items?limit=1000&fields=id,type,name" -H "Authorization: Bearer ACCESS_TOKEN"' To iSuccess
Get ComGetVar Of hoCurl "access_token" To sTemp1
Get ComReplace Of hoSetupCommand "ACCESS_TOKEN" sTemp1 To iSetupReplacements
Get ComGetAsString Of hoSetupCommand To sTemp1
Get ComAddFunction Of hoCurl "findFile" sTemp1 To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
// Register findDestination; registration sends no request.
Get ComSetString Of hoSetupCommand 'curl -X GET "https://api.box.com/2.0/folders/0/items?limit=1000&fields=id,type,name" -H "Authorization: Bearer ACCESS_TOKEN"' To iSuccess
Get ComGetVar Of hoCurl "access_token" To sTemp1
Get ComReplace Of hoSetupCommand "ACCESS_TOKEN" sTemp1 To iSetupReplacements
Get ComGetAsString Of hoSetupCommand To sTemp1
Get ComAddFunction Of hoCurl "findDestination" sTemp1 To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
// Register getFileDetails; registration sends no request.
Get ComSetString Of hoSetupCommand 'curl -X GET "https://api.box.com/2.0/files/{{file_id}}?fields=id,sha1,file_version" -H "Authorization: Bearer ACCESS_TOKEN"' To iSuccess
Get ComGetVar Of hoCurl "access_token" To sTemp1
Get ComReplace Of hoSetupCommand "ACCESS_TOKEN" sTemp1 To iSetupReplacements
Get ComGetAsString Of hoSetupCommand To sTemp1
Get ComAddFunction Of hoCurl "getFileDetails" sTemp1 To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
// Register getEnterprise; registration sends no request.
Get ComSetString Of hoSetupCommand 'curl -X GET "https://api.box.com/2.0/users/me?fields=enterprise" -H "Authorization: Bearer ACCESS_TOKEN"' To iSuccess
Get ComGetVar Of hoCurl "access_token" To sTemp1
Get ComReplace Of hoSetupCommand "ACCESS_TOKEN" sTemp1 To iSetupReplacements
Get ComGetAsString Of hoSetupCommand To sTemp1
Get ComAddFunction Of hoCurl "getEnterprise" sTemp1 To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
// Register output rules once. Chilkat 11.7.0 evaluates {{name}} variables
// when extracting each output, using the current value at that time.
Get ComAddOutput2 Of hoCurl "findParent" "entries" "name" "{{parent_name}}" True "id" "parent_id" To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComAddOutput2 Of hoCurl "findFolder" "entries" "name" "{{folder_name}}" True "id" "folder_id" To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComAddOutput2 Of hoCurl "findFile" "entries" "name" "{{file_name}}" True "id" "file_id" To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComAddOutput2 Of hoCurl "findDestination" "entries" "name" "{{destination_name}}" True "id" "destination_id" To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComAddOutput Of hoCurl "getFileDetails" "file_version.id" "file_version_id" To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComAddOutput Of hoCurl "getFileDetails" "sha1" "file_sha1" To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComAddOutput Of hoCurl "getEnterprise" "enterprise.id" "enterprise_id" To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
// END ONE-TIME SETUP
// The name lookups below assume each listing fits in one page (1000 items).
// Parent and destination names select root children; folder_name selects a child
// of parent_name. "/" selects the root parent. These are not arbitrary paths.
// BEGIN OPERATION -- keep the configured object when reusing it.
// Inputs are names. Retain cached IDs when the selected names have not changed.
Move "/" To sParentName
Move "documents" To sFolderName
Get ComGetVar Of hoCurl "parent_name" To sTemp1
Get ComVarDefined Of hoCurl "parent_id" To bTemp1
If ((sTemp1 <> sParentName) Or ((sParentName = "/") And (bTemp1 = False))) Begin
Send ComSetVar To hoCurl "parent_name" sParentName
Send ComClearVar To hoCurl "parent_id"
Send ComClearVar To hoCurl "folder_id"
Send ComClearVar To hoCurl "file_id"
Send ComClearVar To hoCurl "file_version_id"
Send ComClearVar To hoCurl "file_sha1"
If (sParentName = "/") Begin
Send ComSetVar To hoCurl "parent_id" "0"
End
End
Get ComGetVar Of hoCurl "folder_name" To sTemp1
If (sTemp1 <> sFolderName) Begin
Send ComSetVar To hoCurl "folder_name" sFolderName
Send ComClearVar To hoCurl "folder_id"
Send ComClearVar To hoCurl "file_id"
Send ComClearVar To hoCurl "file_version_id"
Send ComClearVar To hoCurl "file_sha1"
End
// Resolve the named destination first. HttpCurl does not expand variables
// inside multipart -F attributes in the tested build, so this upload is two phases.
Send ComClearTargetOutput To hoCurl "*"
Get Create (RefClass(cComChilkatStringBuilder)) To hoAuthorizedCommand1
If (Not(IsComObjectCreated(hoAuthorizedCommand1))) Begin
Send CreateComObject of hoAuthorizedCommand1
End
Get ComSetString Of hoAuthorizedCommand1 'curl -X GET "https://api.box.com/2.0/folders/{{folder_id}}?fields=id" -H "Authorization: Bearer {{access_token}}"' To iSuccess
Get ComGetVar Of hoCurl "access_token" To sTemp1
Get ComReplace Of hoAuthorizedCommand1 "{{access_token}}" sTemp1 To iHeaderReplacement1
Get ComGetAsString Of hoAuthorizedCommand1 To sTemp1
Get ComDoYourThing Of hoCurl sTemp1 To iSuccess
Get ComStatusCode Of hoCurl To iTemp1
If ((iSuccess <> True) Or (iTemp1 <> 200)) Begin
Get ComStatusCode Of hoCurl To iTemp1
Showln "Box request failed. HTTP status: " iTemp1
Get ComFailReason Of hoCurl To iTemp1
Showln "Failure reason: " iTemp1
Get ComResponseBodyStr Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
Get Create (RefClass(cComChilkatBinData)) To hoData
If (Not(IsComObjectCreated(hoData))) Begin
Send CreateComObject of hoData
End
Get ComLoadFile Of hoData "qa_data/pdf/invoice.pdf" To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoData To sTemp1
Showln sTemp1
Procedure_Return
End
Get Create (RefClass(cComChilkatRest)) To hoRest
If (Not(IsComObjectCreated(hoRest))) Begin
Send CreateComObject of hoRest
End
Get Create (RefClass(cComChilkatOAuth2)) To hoOauth2
If (Not(IsComObjectCreated(hoOauth2))) Begin
Send CreateComObject of hoOauth2
End
Get ComGetVar Of hoCurl "access_token" To sTemp1
Set ComAccessToken Of hoOauth2 To sTemp1
Get pvComObject of hoOauth2 to vOauth2
Get ComSetAuthOAuth2 Of hoRest vOauth2 To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoRest To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComConnect Of hoRest "upload.box.com" 443 True True To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoRest To sTemp1
Showln sTemp1
Procedure_Return
End
Get Create (RefClass(cComChilkatJsonObject)) To hoAttributes
If (Not(IsComObjectCreated(hoAttributes))) Begin
Send CreateComObject of hoAttributes
End
Get ComUpdateString Of hoAttributes "name" "invoice.pdf" To iSuccess
Get ComGetVar Of hoCurl "folder_id" To sTemp1
Get ComUpdateString Of hoAttributes "parent.id" sTemp1 To iSuccess
Get ComAddHeader Of hoRest "Content-Type" "multipart/form-data" To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoRest To sTemp1
Showln sTemp1
Procedure_Return
End
Set ComPartSelector Of hoRest To "1"
Get ComAddHeader Of hoRest "Content-Disposition" 'form-data; name="attributes"' To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoRest To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComEmit Of hoAttributes To sTemp1
Get ComSetMultipartBodyString Of hoRest sTemp1 To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoRest To sTemp1
Showln sTemp1
Procedure_Return
End
Set ComPartSelector Of hoRest To "2"
Get ComAddHeader Of hoRest "Content-Disposition" 'form-data; name="file"; filename="invoice.pdf"' To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoRest To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComAddHeader Of hoRest "Content-Type" "application/pdf" To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoRest To sTemp1
Showln sTemp1
Procedure_Return
End
Get pvComObject of hoData to vData
Get ComSetMultipartBodyBd Of hoRest vData To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoRest To sTemp1
Showln sTemp1
Procedure_Return
End
Set ComPartSelector Of hoRest To "0"
Get ComFullRequestMultipart Of hoRest "POST" "/api/2.0/files/content" To sResponseBody
Get ComLastMethodSuccess Of hoRest To bTemp1
If (bTemp1 <> True) Begin
Get ComLastErrorText Of hoRest To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComResponseStatusCode Of hoRest To iTemp1
If (iTemp1 <> 201) Begin
Get ComResponseStatusCode Of hoRest To iTemp1
Showln "Upload failed: " iTemp1
Showln sResponseBody
Procedure_Return
End
Get Create (RefClass(cComChilkatJsonObject)) To hoResult
If (Not(IsComObjectCreated(hoResult))) Begin
Send CreateComObject of hoResult
End
Get ComLoad Of hoResult sResponseBody To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoResult To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComStringOf Of hoResult "entries[0].id" To sTemp1
Showln "Uploaded file ID: " sTemp1
Send ComSetVar To hoCurl "file_name" "invoice.pdf"
Get ComStringOf Of hoResult "entries[0].id" To sTemp1
Send ComSetVar To hoCurl "file_id" sTemp1
Send ComClearVar To hoCurl "file_version_id"
Send ComClearVar To hoCurl "file_sha1"
End_Procedure