2012-10-22 7 views
6

Dropboxの残りのAPIのDropboxのハッシュを計算する関数metatadaに「ハッシュ」https://www.dropbox.com/developers/reference/api#metadataはローカルで、ファイル

という名前のパラメータを持っている私はコールせずにローカルで任意のリモートAPIの残りの機能をこのハッシュを計算することはできますか?

アップロード帯域幅を減らすには、この値を知っておく必要があります。

答えて

5

メタデータ呼び出しの「hash」パラメータは、実際にはファイルのハッシュではなく、メタデータのハッシュです。メタデータの要求中にメタデータを指定して変更していない場合、メタデータをリクエスト内で再ダウンロードする必要がありません。ファイルハッシュとして使用するためのものではありません。

残念ながら、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

、ありませんあなたがすることはできません。 唯一の方法は、hereと説明されているDropbox APIを使用することです。

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() 
関連する問題