2012-10-22 13 views
6

ड्रॉपबॉक्स बाकी एपीआई, समारोह metatada में एक पैरामीटर "हैश" का नाम दिया है की ड्रॉपबॉक्स हैश गणना https://www.dropbox.com/developers/reference/api#metadataस्थानीय फ़ाइलों

मैं कॉल किसी भी दूरस्थ एपीआई बाकी समारोह के बिना स्थानीय स्तर पर इस हैश की गणना कर सकते हैं?

मुझे अपलोड बैंडविड्थ को कम करने के लिए इस मान को जानने की आवश्यकता है।

उत्तर

5

मेटाडेटा कॉल पर "हैश" पैरामीटर वास्तव में फ़ाइल का हैश नहीं है, लेकिन मेटाडेटा का हैश है। इसका उद्देश्य आपको अपने अनुरोध में मेटाडेटा को दोबारा डाउनलोड करना है यदि मेटाडेटा अनुरोध के दौरान इसे आपूर्ति करके इसे बदला नहीं गया है। यह एक फ़ाइल हैश के रूप में इस्तेमाल करने का इरादा नहीं है।

दुर्भाग्य से मुझे फ़ाइल के हैश प्राप्त करने के लिए ड्रॉपबॉक्स एपीआई के माध्यम से कोई भी रास्ता नहीं दिख रहा है। मुझे लगता है कि आपकी अपलोड बैंडविड्थ को कम करने के लिए आपकी सबसे अच्छी शर्त स्थानीय रूप से हैश की फ़ाइलों को स्थानीय रूप से ट्रैक करना और पता लगाना होगा कि क्या उन्हें अपलोड करना है या नहीं। आपके सिस्टम के आधार पर आप मेटाडेटा अनुरोध पर लौटाए गए "rev" (संशोधन) मान का भी ट्रैक रखना चाहते हैं ताकि आप यह बता सकें कि ड्रॉपबॉक्स पर संस्करण बदल गया है या नहीं।

+0

धन्यवाद। उसने डर दिया कि आपने मुझे क्या बताया है। मुझे url-local_sha1-server_rev को सहेजना होगा :( –

+1

दोह! मैंने अभी इस समस्या को खुद मारा है। मुझे आश्चर्य है कि ड्रॉपबॉक्स एपीआई मेटाडेटा में फ़ाइलों के लिए SHA1 योग या कुछ प्रदान नहीं करता है, इसलिए आप ' टी को मैन्युअल रूप से इसका ट्रैक रखना है। –

1

यह सीधे आपके प्रश्न का उत्तर नहीं देगा, लेकिन यह एक कामकाज के रूप में अधिक है; ड्रॉपबॉक्स एसडीके एक साधारण 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 समझाया गया है।

1

https://www.dropbox.com/developers/reference/content-hash बताता है कि ड्रॉपबॉक्स उनकी फ़ाइल हैश की गणना कैसे करता है। इसका एक पायथन कार्यान्वयन नीचे है:

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() 
संबंधित मुद्दे