· 6 years ago · Sep 13, 2019, 03:54 PM
1import os
2import sys
3import fire
4import json
5from qiniu import Auth, put_file, etag, BucketManager, build_batch_stat
6
7
8fail_list = []
9
10default_extname = 'jpg'
11
12class QiniuCommandLine(object):
13
14 _access_key = ''
15 _secret_key = ''
16 _bucket_name = ''
17 _prefix = ''
18
19 def upload_by_qiniu(self, localName, key_expire_sec=60):
20 q = Auth(self._access_key, self._secret_key)
21 remoteKey = self.get_file_key(localName)
22 token = q.upload_token(self._bucket_name, remoteKey, key_expire_sec)
23 try:
24 ret, info = put_file(token, remoteKey, localName)
25 except Exception as e:
26 logger.exception(e)
27 fail_list.append({
28 'localName': localName,
29 'error': 'qiniu_error'
30 })
31 return
32
33 if not ret:
34 fail_list.append({
35 'localName': localName,
36 'error': 'ret_error'
37 })
38 return
39
40 if not ret.get('key') or ret['key'] != remoteKey:
41 fail_list.append({
42 'localName': localName,
43 'error': 'key_error'
44 })
45 return
46
47 elif not ret.get('key') or ret['hash'] != etag(localName):
48 fail_list.append({
49 'localName': localName,
50 'error': 'etag_error'
51 })
52 return
53
54 def get_file_key(self, localName):
55 filename = localName.split('/')[-1]
56 extname = filename.split('.')[-1].lower()
57 fname = filename.split('.')[0]
58 return self._prefix + filename + '.' + extname
59
60 def get_valid_files(self, path):
61 file_names = []
62 local_files = os.listdir(path)
63 for item in local_files:
64 if not os.path.isfile(os.path.join(path, item)):
65 continue
66
67 if '.%s' % default_extname.lower() not in item.lower():
68 continue
69
70 ext = item.split('/')[-1].split('.')[-1].lower()
71 if ext != default_extname:
72 continue
73
74 file_names.append(item)
75 return file_names
76
77 def upload(self, path, access_key, secret_key, bucket_name, prefix):
78 self._access_key = access_key
79 self._secret_key = secret_key
80 self._bucket_name = bucket_name
81 self._prefix = prefix
82
83 file_names = self.get_valid_files(path)
84 for index, item in enumerate(file_names):
85 self.upload_by_qiniu(os.path.join(path, item))
86 print('%s / %s picture uploaded: %s' % (index + 1, len(file_names), item))
87
88 for item in fail_list:
89 print('%s: %s' % (item['localName'], item['error']))
90
91 print('<upload finished>')
92 print('<total: %s>' % len(file_names))
93 print('<fail count: %s>' % len(fail_list))
94
95 def check(self, path, access_key, secret_key, bucket_name, prefix):
96 self._access_key = access_key
97 self._secret_key = secret_key
98 self._bucket_name = bucket_name
99 self._prefix = prefix
100
101 q = Auth(access_key, secret_key)
102 bucket = BucketManager(q)
103 file_names = self.get_valid_files(path)
104 keys = []
105 for index, item in enumerate(file_names):
106 localKey = self.get_file_key(item)
107 keys.append(localKey)
108
109 ops = build_batch_stat(bucket_name, keys)
110 ret, info = bucket.batch(ops)
111 if not info:
112 print('qiniu_info_error')
113 return
114
115 query_data = json.loads(info.text_body)
116 for index, item in enumerate(query_data):
117 if item.get('code') != 200:
118 print('[%s] %s' % (file_names[index], item['data']['error'] if item.get('data') and item['data']['error'] else item['code']))
119
120if __name__ == '__main__':
121 fire.Fire(QiniuCommandLine)