Dropbox的REST API,在功能上metatada有一個參數命名爲「哈希」 Dropbox的哈希https://www.dropbox.com/developers/reference/api#metadata本地計算文件
我可以在本地計算這個哈希沒有任何調用遠程API休息功能?
我需要知道這個值來減少上傳帶寬。
Dropbox的REST API,在功能上metatada有一個參數命名爲「哈希」 Dropbox的哈希https://www.dropbox.com/developers/reference/api#metadata本地計算文件
我可以在本地計算這個哈希沒有任何調用遠程API休息功能?
我需要知道這個值來減少上傳帶寬。
元數據調用中的「散列」參數實際上不是文件的散列,而是元數據的散列。它的目的是爲了節省您在請求中重新下載元數據(如果它在元數據請求期間未提供元數據)。它不打算用作文件散列。
不幸的是,我沒有看到任何方式通過Dropbox API來獲取文件本身的散列。我認爲減少上傳帶寬的最佳方法是跟蹤本地文件的散列值,並在確定是否上傳時檢測它們是否發生了變化。根據您的系統,您還可能需要跟蹤元數據請求上返回的「rev」(修訂版)值,以便確定Dropbox本身的版本是否已更改。
這不會直接回答你的問題,但意味着更多的解決方法; 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]')
就我個人而言,你就是不行。 唯一的方法是使用Dropbox API,解釋here。
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()
謝謝。他害怕你告訴我的。我必須保存url-local_sha1-server_rev :( –
Doh!我只是自己碰到這個問題,我真的很驚訝Dropbox API沒有提供SHA1總和或元數據文件的東西,不得不手動跟蹤這個。 –