Tim: Agree with Kirk — thanks for posting this!
-- Douglas von Roeder 949-336-2902 On Fri, Mar 8, 2019 at 6:12 PM Kirk Brooks via 4D_Tech <[email protected]> wrote: > Tim, > Thanks for sharing this. > > On Fri, Mar 8, 2019 at 3:55 PM Tim Nevels via 4D_Tech < > [email protected]> > wrote: > > > A few weeks ago I posted a message asking if anyone had written code to > > upload and download files to Dropbox. Got no responses other than “the > API > > looks like it is easy to do”. > > > > Today I spent time writing a couple of methods to allow uploading and > > downloading files from Dropbox with native 4D commands using the Dropbox > v2 > > API. And people were right, it was not too difficult. The v2 API is > > implemented very nicely and documented fairly well. I found a few > > documentation errors, but they were easily dealt with. > > > > 4D v17 provided all the commands needed to make it all work with very > > little code. Doing this with NTK would easily take 3 times the amount of > > code. > > > > My current needs are very simple. I want to upload a file to Dropbox and > > replace any existing file if necessary. Dropbox maximum file size for a > > single upload operation is 150MB. That’s more than enough for my needs. > But > > if you want to upload larger files — up to the Dropbox API max size of > > 350MB — you’ll have to implement an “upload session”. > > > > Download requirements are also simple. Just download a file from a > Dropbox > > path to a path on your hard drive. Dropbox paths are in POSIX format. > > > > The Dropbox v2 API uses OAuth 2, but that basically boils down to > creating > > an “App” and getting an “access token” the you use with all the API > calls. > > I’ll leave it up to you to go read the docs and set that all up. It’s > easy. > > > > The code uses dot notation, but with a little work it could be ported to > > work with older versions for 4D probably back to v14. Code is > > cross-platform without any extra effort needed. > > > > Here is me giving back to the group so you don’t have to spend a day > > developing and testing code. If others implement more of the Dropbox v2 > > API, please post it to the iNUG to help others. > > > > // =========================================== > > // PROJECT METHOD: Dropbox_UploadFile > > > > // PARAMETERS: $0 = results object > > // $1 = dropbox access token > > // $2 = dropbox path > > // $3 = file path > > > > // DESCRIPTION: Uploads a file to Dropbox using the v2 API > > // Max upload size in a single transfer is 150MB. > > > > // https://www.dropbox.com/developers/documentation/http/documentation > > > > // CREATED BY: Tim Nevels, Innovative Solutions ©2019 > > // DATE: 3/8/19 > > // LAST MODIFIED: > > // ============================================ > > > > C_OBJECT($0;$results_o) > > C_TEXT($1;$dropboxAccessToken_t) > > C_TEXT($2;$dropboxPath_t) > > C_TEXT($3;$filePath_t) > > $dropboxAccessToken_t:=$1 > > $dropboxPath_t:=$2 > > $filePath_t:=$3 > > > > // declare local variables > > C_TEXT($headerValue_t;$requestURL_t;$response_t) > > C_LONGINT($statusCode_l) > > C_BLOB($content_x) > > C_OBJECT($headerValue_o;$response_o) > > ARRAY TEXT($headerName_at;0) > > ARRAY TEXT($headerValue_at;0) > > > > // setup http header > > APPEND TO ARRAY($headerName_at;"Authorization") > > APPEND TO ARRAY($headerValue_at;"Bearer "+$dropboxAccessToken_t) > > > > // set upload header values > > APPEND TO ARRAY($headerName_at;"Content-Type") > > APPEND TO ARRAY($headerValue_at;"application/octet-stream”) > > > > APPEND TO ARRAY($headerName_at;"Dropbox-API-Arg") > > $headerValue_o:=New object(\ > > "path";$dropboxPath_t;\ > > "mode";"add";\ > > "autorename";False) // overwrite any existing file > > $headerValue_t:=JSON Stringify($headerValue_o) > > APPEND TO ARRAY($headerValue_at;$headerValue_t) > > > > // set url > > $requestURL_t:="https://content.dropboxapi.com/2/files/upload" > > > > // load the file > > DOCUMENT TO BLOB($filePath_t;$content_x) > > > > // check file size > > If (BLOB size($content_x)>(1024*1024*149)) // over 149MB, too close to > > limit to try > > $results_o:=New object(\ > > "success";False;\ > > "statusCode";408;\ > > "errorMessage";"File is to large to upload in one piece") > > Else > > // upload the file > > HTTP SET OPTION(HTTP compression;1) // do compression > > HTTP SET OPTION(HTTP timeout;60*10) // 10 minute timeout > > $statusCode_l:=HTTP Request(HTTP POST > > > method;$requestURL_t;$content_x;$response_t;$headerName_at;$headerValue_at) > > > > // build results object > > Case of > > : ($statusCode_l=200) // upload was a success > > $results_o:=New object(\ > > "success";True;\ > > "statusCode";$statusCode_l;\ > > "errorMessage";"File upload was successful") > > > > : ($statusCode_l=409) // endpoint specific problem > > $response_o:=JSON Parse($response_t) > > $results_o:=New object(\ > > "success";False;\ > > "statusCode";$statusCode_l;\ > > "errorMessage";$response_o.error_summary) > > > > Else // other problem > > $results_o:=New object(\ > > "success";False;\ > > "statusCode";$statusCode_l;\ > > "errorMessage";"HTTP Request > failed"+Char(Carriage > > return)+Char(Carriage return)+\ > > $response_t) > > End case > > End if > > > > // return results > > $0:=$results_o > > > > > > // =========================================== > > // PROJECT METHOD: Dropbox_DownloadFile > > > > // PARAMETERS: $0 = results object > > // $1 = dropbox access token > > // $2 = dropbox path > > // $3 = file path > > > > // DESCRIPTION: Downloads a file from Dropbox using the v2 API > > > > // https://www.dropbox.com/developers/documentation/http/documentation > > > > // CREATED BY: Tim Nevels, Innovative Solutions ©2019 > > // DATE: 3/8/19 > > // LAST MODIFIED: > > // ============================================ > > > > C_OBJECT($0;$results_o) > > C_TEXT($1;$dropboxAccessToken_t) > > C_TEXT($2;$dropboxPath_t) > > C_TEXT($3;$filePath_t) > > $dropboxAccessToken_t:=$1 > > $dropboxPath_t:=$2 > > $filePath_t:=$3 > > > > // declare local variables > > C_TEXT($headerValue_t;$requestURL_t;$content_t;$response_t) > > C_LONGINT($statusCode_l) > > C_BLOB($response_x) > > C_OBJECT($response_o;$headerValue_o) > > ARRAY TEXT($headerName_at;0) > > ARRAY TEXT($headerValue_at;0) > > > > // setup http header > > APPEND TO ARRAY($headerName_at;"Authorization") > > APPEND TO ARRAY($headerValue_at;"Bearer "+$dropboxAccessToken_t) > > > > // set download header value > > APPEND TO ARRAY($headerName_at;"Dropbox-API-Arg") > > $headerValue_o:=New object(\ > > "path";$dropboxPath_t) > > $headerValue_t:=JSON Stringify($headerValue_o) > > APPEND TO ARRAY($headerValue_at;$headerValue_t) > > > > // set url > > $requestURL_t:="https://content.dropboxapi.com/2/files/download" > > > > // download the file > > HTTP SET OPTION(HTTP compression;1) // do compression > > HTTP SET OPTION(HTTP timeout;60*10) // 10 minute timeout > > $statusCode_l:=HTTP Request(HTTP POST > > > method;$requestURL_t;$content_t;$response_x;$headerName_at;$headerValue_at) > > > > // build results object > > Case of > > : ($statusCode_l=200) // download was a success > > $results_o:=New object(\ > > "success";True;\ > > "statusCode";$statusCode_l;\ > > "errorMessage";"File download was successful") > > > > : ($statusCode_l=409) // endpoint specific problem > > $response_t:=BLOB to text($response_x;UTF8 text without > > length) > > $response_o:=JSON Parse($response_t) > > $results_o:=New object(\ > > "success";False;\ > > "statusCode";$statusCode_l;\ > > "errorMessage";$response_o.error_summary) > > > > Else // other problem > > $results_o:=New object(\ > > "success";False;\ > > "statusCode";$statusCode_l;\ > > "errorMessage";"HTTP Request failed"+Char(Carriage > > return)+Char(Carriage return)+\ > > $response_t) > > End case > > > > // convert response to a file > > If ($statusCode_l=200) > > BLOB TO DOCUMENT($filePath_t;$response_x) > > End if > > > > // return results > > $0:=$results_o > > > > > > > > Tim > > > > ***************************************** > > Tim Nevels > > Innovative Solutions > > 785-749-3444 > > [email protected] > > ***************************************** > > > > ********************************************************************** > > 4D Internet Users Group (4D iNUG) > > Archive: http://lists.4d.com/archives.html > > Options: https://lists.4d.com/mailman/options/4d_tech > > Unsub: mailto:[email protected] > > ********************************************************************** > > > > -- > Kirk Brooks > San Francisco, CA > ======================= > > What can be said, can be said clearly, > and what you can’t say, you should shut up about > > *Wittgenstein and the Computer * > ********************************************************************** > 4D Internet Users Group (4D iNUG) > Archive: http://lists.4d.com/archives.html > Options: https://lists.4d.com/mailman/options/4d_tech > Unsub: mailto:[email protected] > ********************************************************************** ********************************************************************** 4D Internet Users Group (4D iNUG) Archive: http://lists.4d.com/archives.html Options: https://lists.4d.com/mailman/options/4d_tech Unsub: mailto:[email protected] **********************************************************************

