Re: Dropbox Upload and Dropbox Download Methods
On Mar 10, 2019, at 9:34 AM, Douglas von Roeder wrote: > Agree with Kirk — thanks for posting this! The place that does my ftp hosting is killing it, so I needed to find a new ftp host. Then I thought… why not use Dropbox? I’ve got a 1TB of space there that is not being used. I’m just getting started using it and so far it’s working OK. I did run into an error today when trying to upload a file and replace one that already exists. Not sure if it’s a problem yet or not, but I may need to implement Dropbox_DeleteFile method if it continues. Also wanted to point out that there is a special Dropbox link that you can use for “direct download” of content as opposed to the standard links that first take you to the Dropbox website. Here is a test of the “standard” Dropbox link to my company logo: https://www.dropbox.com/s/i3tzh5ukwhbtvsv/islogo.png?dl=0 Here is a link that should direct download the same logo without taking you to the Dropbox website first: https://dl.dropboxusercontent.com/s/i3tzh5ukwhbtvsv/islogo.png Tim * Tim Nevels Innovative Solutions 785-749-3444 timnev...@mac.com * ** 4D Internet Users Group (4D iNUG) Archive: http://lists.4d.com/archives.html Options: https://lists.4d.com/mailman/options/4d_tech Unsub: mailto:4d_tech-unsubscr...@lists.4d.com **
Re: Dropbox Upload and Dropbox Download Methods
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 <4d_tech@lists.4d.com> wrote: > Tim, > Thanks for sharing this. > > On Fri, Mar 8, 2019 at 3:55 PM Tim Nevels via 4D_Tech < > 4d_tech@lists.4d.com> > 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") > > > > :
Re: Dropbox Upload and Dropbox Download Methods
Tim, Thanks for sharing this. On Fri, Mar 8, 2019 at 3:55 PM Tim Nevels via 4D_Tech <4d_tech@lists.4d.com> 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(\ >