cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Announcements
What’s new: end-to-end encryption, Replay and Dash updates. Find out more about these updates, new features and more here.

Dropbox API Support & Feedback

Find help with the Dropbox API from other developers.

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Error downloading files from dropbox API

Error downloading files from dropbox API

pyraxic
Helpful | Level 6
Go to solution

I am trying to download files from dropbox but keep hitting the ValidationError.

 

for dfiles in flist:
        dbx.files_download_to_file('/Users/fela/Downloads/dropbox', dfiles, rev=None)

Here is the error:

ValidationError at /dropbox_auth_finish
'2005-02-15 00.39.15-2.tif' did not match pattern '(/(.|[\r\n])*|id:.*)|(rev:[0-9a-f]{9,})|(ns:[0-9]+(/.*)?)'
Request Method:	GET
Request URL:	https://localhost:8000/dropbox_auth_finish?state=fNWCqBEYwxETbqJU-N5zlA%3D%3D&code=wPfEvSKsCIEAAAAAAAAZdQWDsobxTQufArgHJU7is
Django Version:	1.11.3
Exception Type:	ValidationError
Exception Value:	
'2005-02-15 00.39.15-2.tif' did not match pattern '(/(.|[\r\n])*|id:.*)|(rev:[0-9a-f]{9,})|(ns:[0-9]+(/.*)?)'
Exception Location:	/Users/fela/miniconda3/envs/clauks/lib/python3.6/site-packages/dropbox/stone_validators.py in validate, line 317
Python Executable:	/Users/fela/miniconda3/envs/clauks/bin/python
Python Version:	3.6.2

 

10 Replies 10

acomerford
New member | Level 2
Go to solution

Another solution that might better fit your needs is to use the http api instead https://www.dropbox.com/developers/documentation/http/overview.

Specifically looking at the "files/download" endpoint. https://www.dropbox.com/developers/documentation/http/documentation#files-download

With the python dropbox sdk you download each file synchronously. In order to get some more efficency you can use some of the asynchronous functionality in python 3.7 (and some additional libraries) to try and download your files together.

Here is some example code that will save a list of files to your "/tmp" directory

import aiohttp
import aiofiles
import asyncio
import json
from tqdm import tqdm_notebook as tqdm

DROPBOX_URL='https://content.dropboxapi.com/2/files/download'

async def dropbox_async_download(session, path, prefix_path="/tmp"):
    
    ## Create headers to talk to dropbox api
    ## see https://www.dropbox.com/developers/documentation/http/documentation#files-download
    headers = {
        "Authorization": "Bearer %s"%os.environ["DROPBOX_ACCESS_TOKEN"],
        "Dropbox-API-Arg": json.dumps({"path": path})
    }
    
    ## Create async post request
    ## Open file asynchronously
    ## write chunks from server async to file
    i=0
    with tqdm(total=1000) as pbar:
        async with session.post(DROPBOX_URL, headers=headers) as response,\
                   aiofiles.open(prefix_path+path, "w")       as f:
                async for chunk, _ in response.content.iter_chunks():
                    await f.write(chunk.decode('utf-8'))
                    pbar.set_postfix(file=path)
                    pbar.update(1)
    print ("Done!", path)

async def dropbox_download_files(files):
    async with aiohttp.ClientSession() as session:
        coroutines = list(
            map(lambda f:dropbox_async_download(session,f),files)
        )
        return await asyncio.gather(*coroutines)

files = ["a.txt", "b.txt", "c.txt"]
loop = asyncio.get_event_loop()
loop.run_until_complete(dropbox_download_files(files)

Hope this helps!

Need more support?
Who's talking

Top contributors to this post

  • User avatar
    acomerford New member | Level 2
  • User avatar
    Greg-DB Dropbox Staff
  • User avatar
    pyraxic Helpful | Level 6
  • User avatar
    rhernandez8305 Helpful | Level 6
What do Dropbox user levels mean?