代码不是很多就贴出来吧
#!/usr/bin/env python #-*- coding:utf-8 -*- # # AUTHOR = "heqingpan" # AUTHOR_EMAIL = "[email protected]" # URL = "http://git.oschina.net/hqp/qiniu_sync" import qiniu from qiniu import Auth from qiniu import BucketManager import os import re import urllib2 import sys access_key = '' secret_key = '' bucket_name = '' bucket_domain = '' q = Auth (access_key, secret_key ) bucket = BucketManager (q ) basedir=os.path.realpath (os.path.dirname (__file__)) #同步目录 #basedir="" filename=__file__ ignore_paths=[filename,"{0}c".format (filename )] ignore_names=[".DS_Store",".git",".gitignore"] charset="utf8" diff_time=2*60 def list_all (bucket_name, bucket=None, prefix="", limit=100 ): rlist=[] if bucket is None: bucket = BucketManager (q ) marker = None eof = False while eof is False: ret, eof, info = bucket.list (bucket_name, prefix=prefix, marker=marker, limit=limit ) marker = ret.get ('marker', None ) for item in ret['items']: rlist.append (item["key"]) if eof is not True: # 错误处理 #print "error" pass return rlist def get_files (basedir="",fix="",rlist=None,ignore_paths=[],ignore_names=[]): if rlist is None: rlist=[] for subfile in os.listdir (basedir ): temp_path=os.path.join (basedir,subfile ) tp=os.path.join (fix,subfile ) if tp in ignore_names: continue if tp in ignore_paths: continue if os.path.isfile (temp_path ): rlist.append (tp ) elif os.path.isdir (temp_path ): get_files (temp_path,tp,rlist,ignore_paths,ignore_names ) return rlist def get_valid_key_files (subdir=""): basedir=subdir or basedir files = get_files (basedir=basedir,ignore_paths=ignore_paths,ignore_names=ignore_names ) return map (lambda f:(f.replace ("\\","/"),f ),files ) def sync (): qn_keys=list_all (bucket_name,bucket ) qn_set=set (qn_keys ) l_key_files=get_valid_key_files (basedir ) k2f={} update_keys=[] u_count=500 u_index=0 for k,f in l_key_files: k2f[k]=f str_k=k if isinstance (k,str ): k=k.decode (charset ) if k in qn_set: update_keys.append (str_k ) u_index+=1 if u_index > u_count: u_index-=u_count update_file (k2f,update_keys ) update_keys=[] else: # upload upload_file (k,os.path.join (basedir,f )) if update_keys: update_file (k2f,update_keys ) print "sync end" def update_file (k2f,ulist ): ops=qiniu.build_batch_stat (bucket_name,ulist ) rets,infos = bucket.batch (ops ) for i in xrange (len (ulist )): k=ulist[i] f=k2f.get (k ) ret=rets[i]["data"] size=ret.get ("fsize",None ) put_time = int (ret.get ("putTime")/10000000 ) local_size=os.path.getsize (f ) local_time=int (os.path.getatime (f )) if local_size==size: continue if put_time >= local_time - diff_time: # is new continue # update upload_file (k,os.path.join (basedir,f )) def upload_file (key,localfile ): print "upload_file:" print key token = q.upload_token (bucket_name, key ) mime_type = get_mime_type (localfile ) params = {'x:a': 'a'} progress_handler = lambda progress, total: progress ret, info = qiniu.put_file (token, key, localfile, params, mime_type, progress_handler=progress_handler ) def get_mime_type (path ): mime_type = "text/plain" return mime_type def down_file (key,basedir="",is_private=1,expires=3600 ): if isinstance (key,unicode ): key=key.encode (charset ) url = 'http://%s/%s' % (bucket_domain, key ) if is_private: url=q.private_download_url (url, expires=expires ) c=urllib2.urlopen (url ) fpath=key.replace ("/",os.sep ) savepath=os.path.join (basedir,fpath ) dir_=os.path.dirname (savepath ) if not os.path.isdir (dir_): os.makedirs (dir_) elif os.path.isfile (savepath ): os.remove (savepath ) f = file (savepath, 'wb') f.write (c.read ()) f.close () def down_all (prefix=""): import traceback for key in list_all (bucket_name,bucket,prefix=prefix ): try: down_file (key,basedir=basedir ) print "down:\t"+key except: print "error down:\t"+key print traceback.format_exc () print "down end" def main (): if len (sys.argv )>1: if sys.argv[1]=="down": prefix=len (sys.argv )>2 and sys.argv[2] or "" down_all (prefix=prefix ) return sync () if __name__=="__main__": main ()
安装七牛 Python SDK
pip install qiniu
填写脚本文件(qiniusync.py )的配置信息
access_key = ''
secret_key = ''
bucket_name = ''
bucket_domain = ''
注册后可以拿到对应的信息
将脚本文件(qiniusync.py )拷贝到待同步根目录
运行脚本
python qiniusync.py
python qiniusync.py down
python qiniusync.py down [文件路径前缀]