2012-10-22 5 views

Antwort

5

Der Parameter "Hash" im Metadatenaufruf ist nicht der Hash der Datei, sondern ein Hash der Metadaten. Der Zweck besteht darin, zu verhindern, dass Sie die Metadaten in Ihrer Anforderung erneut herunterladen müssen, wenn sie nicht durch die Bereitstellung während der Metadatenanforderung geändert wurden. Es ist nicht dazu gedacht, als Datei-Hash verwendet zu werden.

Leider sehe ich keinen Weg über die Dropbox-API, um einen Hash der Datei selbst zu erhalten. Ich denke, Ihre beste Lösung für die Reduzierung Ihrer Upload-Bandbreite wäre es, die Hashwerte Ihrer Dateien lokal zu verfolgen und festzustellen, ob sie sich geändert haben, wenn Sie entscheiden, ob Sie sie hochladen wollen. Abhängig von Ihrem System möchten Sie wahrscheinlich auch den Wert "rev" (Revision) verfolgen, der für die Metadatenanforderung zurückgegeben wird, damit Sie erkennen können, ob sich die Version in Dropbox selbst geändert hat.

+0

Danke. Er fürchtete, was du mir gesagt hast. Ich muss url-local_sha1-server_rev speichern :( –

+1

Doh! Ich habe gerade dieses Problem selbst getroffen. Ich bin wirklich überrascht, dass die Dropbox-API keine SHA1-Summe oder etwas für die Dateien in den Metadaten zur Verfügung stellt. Das müssen Sie manuell verfolgen. –

1

Dies wird nicht direkt Ihre Frage beantworten, aber ist eher als Workaround gedacht; Die Dropbox sdk gibt ein einfaches Beispiel für das Programm upown.py, das die Dateigröße und die Änderungszeit verwendet, um die Währung einer Datei zu überprüfen.

ein verkürztes Beispiel aus updown.py genommen:

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

Soweit ich bin besorgt darüber, Nein, Sie können nicht. Die einzige Möglichkeit ist die Verwendung der Dropbox-API, die unter here erläutert wird.

1

https://www.dropbox.com/developers/reference/content-hash erläutert, wie Dropbox ihre Dateihashes berechnet. Eine Python-Implementierung davon ist unten:

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