2012-10-22 7 views

risposta

5

Il parametro "hash" sulla chiamata ai metadati non è in realtà l'hash del file, ma un hash dei metadati. Lo scopo è quello di risparmiare il dover scaricare nuovamente i metadati nella richiesta, se non è stata modificata fornendola durante la richiesta dei metadati. Non è inteso per essere usato come un file hash.

Purtroppo non vedo alcun modo tramite l'API di Dropbox per ottenere un hash del file stesso. Penso che la soluzione migliore per ridurre la larghezza di banda del caricamento sarebbe tenere traccia degli hash dei file localmente e rilevare se sono stati modificati per determinare se caricarli. A seconda del sistema, è anche probabile che tu tenga traccia del valore "rev" (revisione) restituito sulla richiesta di metadati, in modo che tu possa stabilire se la versione su Dropbox stessa è cambiata.

+0

Grazie. Temeva quello che mi hai detto. Dovrò salvare url-local_sha1-server_rev :( –

+1

Doh! Ho appena colpito questo problema. Sono davvero sorpreso che l'API di Dropbox non fornisca una somma SHA1 o qualcosa per i file nei metadati, così non lo farai t tenere traccia di questo manualmente. –

1

Questo non risponderà direttamente alla tua domanda, ma è inteso più come soluzione temporanea; Il dropbox sdk fornisce un semplice esempio di updown.py che utilizza la dimensione del file e il tempo di modifica per controllare la valuta di un file.

un esempio abbreviato tratto da updown.py:

dbx = dropbox.Dropbox(api_token) 
... 
# returns a dictionary of name: FileMetaData 
listing = list_folder(dbx, folder, subfolder) 
# name is the name of the file 
md = listing[name] 
# fullname is the path of the local file 
mtime = os.path.getmtime(fullname) 
mtime_dt = datetime.datetime(*time.gmtime(mtime)[:6]) 
size = os.path.getsize(fullname) 
if (isinstance(md, dropbox.files.FileMetadata) and mtime_dt == md.client_modified and size == md.size): 
    print(name, 'is already synced [stats match]') 
0

Per quanto mi riguarda, No non si può. L'unico modo è l'utilizzo dell'API Dropbox, che viene spiegato here.

1

https://www.dropbox.com/developers/reference/content-hash spiega come Dropbox calcola i propri hash di file. Un'implementazione Python di questo è la seguente:

import hashlib 
import math 
import os 

DROPBOX_HASH_CHUNK_SIZE = 4*1024*1024 

def compute_dropbox_hash(filename): 
    file_size = os.stat(filename).st_size 
    num_chunks = int(math.ceil(file_size/DROPBOX_HASH_CHUNK_SIZE)) 

    with open(filename, 'rb') as f: 
     block_hashes = b'' 
     while True: 
      chunk = f.read(DROPBOX_HASH_CHUNK_SIZE) 
      if not chunk: 
       break 
      block_hashes += hashlib.sha256(chunk).digest() 
     return hashlib.sha256(block_hashes).hexdigest() 
Problemi correlati