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(\
>   

Dropbox Upload and Dropbox Download Methods

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