Re: Dropbox Upload and Dropbox Download Methods

2019-03-11 Thread Tim Nevels via 4D_Tech
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

2019-03-09 Thread Douglas von Roeder via 4D_Tech
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

2019-03-08 Thread Kirk Brooks via 4D_Tech
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(\
>