2012-10-22 67 views

回答

5

元數據調用中的「散列」參數實際上不是文件的散列,而是元數據的散列。它的目的是爲了節省您在請求中重新下載元數據(如果它在元數據請求期間未提供元數據)。它不打算用作文件散列。

不幸的是,我沒有看到任何方式通過Dropbox API來獲取文件本身的散列。我認爲減少上傳帶寬的最佳方法是跟蹤本地文件的散列值,並在確定是否上傳時檢測它們是否發生了變化。根據您的系統,您還可能需要跟蹤元數據請求上返回的「rev」(修訂版)值,以便確定Dropbox本身的版本是否已更改。

+0

謝謝。他害怕你告訴我的。我必須保存url-local_sha1-server_rev :( –

+1

Doh!我只是自己碰到這個問題,我真的很驚訝Dropbox API沒有提供SHA1總和或元數據文件的東西,不得不手動跟蹤這個。 –

1

這不會直接回答你的問題,但意味着更多的解決方法; Dropbox sdk給出了一個簡單的updown.py示例,它使用文件大小和修改時間來檢查文件的貨幣。

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

就我個人而言,你就是不行。 唯一的方法是使用Dropbox API,解釋here

1

https://www.dropbox.com/developers/reference/content-hash解釋了Dropbox如何計算其文件哈希值。這是一個Python實現如下:

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