12
12
13
13
def put_data (
14
14
up_token , key , data , params = None , mime_type = 'application/octet-stream' , check_crc = False , progress_handler = None ,
15
- fname = None , hostscache_dir = None ):
15
+ fname = None , hostscache_dir = None , metadata = None ):
16
16
"""上传二进制流到七牛
17
17
18
18
Args:
@@ -23,7 +23,8 @@ def put_data(
23
23
mime_type: 上传数据的mimeType
24
24
check_crc: 是否校验crc32
25
25
progress_handler: 上传进度
26
- hostscache_dir: host请求 缓存文件保存位置
26
+ hostscache_dir: host请求 缓存文件保存位置
27
+ metadata: 元数据
27
28
28
29
Returns:
29
30
一个dict变量,类似 {"hash": "<Hash string>", "key": "<Key string>"}
@@ -41,13 +42,14 @@ def put_data(
41
42
final_data = data
42
43
43
44
crc = crc32 (final_data )
44
- return _form_put (up_token , key , final_data , params , mime_type , crc , hostscache_dir , progress_handler , fname )
45
+ return _form_put (up_token , key , final_data , params , mime_type ,
46
+ crc , hostscache_dir , progress_handler , fname , metadata = metadata )
45
47
46
48
47
49
def put_file (up_token , key , file_path , params = None ,
48
50
mime_type = 'application/octet-stream' , check_crc = False ,
49
51
progress_handler = None , upload_progress_recorder = None , keep_last_modified = False , hostscache_dir = None ,
50
- part_size = None , version = None , bucket_name = None ):
52
+ part_size = None , version = None , bucket_name = None , metadata = None ):
51
53
"""上传文件到七牛
52
54
53
55
Args:
@@ -59,10 +61,11 @@ def put_file(up_token, key, file_path, params=None,
59
61
check_crc: 是否校验crc32
60
62
progress_handler: 上传进度
61
63
upload_progress_recorder: 记录上传进度,用于断点续传
62
- hostscache_dir: host请求 缓存文件保存位置
63
- version 分片上传版本 目前支持v1/v2版本 默认v1
64
- part_size 分片上传v2必传字段 默认大小为4MB 分片大小范围为1 MB - 1 GB
65
- bucket_name 分片上传v2字段 空间名称
64
+ hostscache_dir: host请求 缓存文件保存位置
65
+ version: 分片上传版本 目前支持v1/v2版本 默认v1
66
+ part_size: 分片上传v2必传字段 默认大小为4MB 分片大小范围为1 MB - 1 GB
67
+ bucket_name: 分片上传v2字段 空间名称
68
+ metadata: 元数据信息
66
69
67
70
Returns:
68
71
一个dict变量,类似 {"hash": "<Hash string>", "key": "<Key string>"}
@@ -78,18 +81,17 @@ def put_file(up_token, key, file_path, params=None,
78
81
mime_type , progress_handler ,
79
82
upload_progress_recorder = upload_progress_recorder ,
80
83
modify_time = modify_time , keep_last_modified = keep_last_modified ,
81
- part_size = part_size , version = version , bucket_name = bucket_name )
84
+ part_size = part_size , version = version , bucket_name = bucket_name , metadata = metadata )
82
85
else :
83
86
crc = file_crc32 (file_path )
84
87
ret , info = _form_put (up_token , key , input_stream , params , mime_type ,
85
88
crc , hostscache_dir , progress_handler , file_name ,
86
- modify_time = modify_time , keep_last_modified = keep_last_modified )
89
+ modify_time = modify_time , keep_last_modified = keep_last_modified , metadata = metadata )
87
90
return ret , info
88
91
89
92
90
93
def _form_put (up_token , key , data , params , mime_type , crc , hostscache_dir = None , progress_handler = None , file_name = None ,
91
- modify_time = None ,
92
- keep_last_modified = False ):
94
+ modify_time = None , keep_last_modified = False , metadata = None ):
93
95
fields = {}
94
96
if params :
95
97
for k , v in params .items ():
@@ -114,6 +116,11 @@ def _form_put(up_token, key, data, params, mime_type, crc, hostscache_dir=None,
114
116
if modify_time and keep_last_modified :
115
117
fields ['x-qn-meta-!Last-Modified' ] = rfc_from_timestamp (modify_time )
116
118
119
+ if metadata :
120
+ for k , v in metadata .items ():
121
+ if k .startswith ('x-qn-meta-' ):
122
+ fields [k ] = str (v )
123
+
117
124
r , info = http ._post_file (url , data = fields , files = {'file' : (fname , data , mime_type )})
118
125
if r is None and info .need_retry ():
119
126
if info .connect_failed :
@@ -135,10 +142,10 @@ def _form_put(up_token, key, data, params, mime_type, crc, hostscache_dir=None,
135
142
def put_stream (up_token , key , input_stream , file_name , data_size , hostscache_dir = None , params = None ,
136
143
mime_type = None , progress_handler = None ,
137
144
upload_progress_recorder = None , modify_time = None , keep_last_modified = False ,
138
- part_size = None , version = None , bucket_name = None ):
145
+ part_size = None , version = None , bucket_name = None , metadata = None ):
139
146
task = _Resume (up_token , key , input_stream , file_name , data_size , hostscache_dir , params , mime_type ,
140
147
progress_handler , upload_progress_recorder , modify_time , keep_last_modified ,
141
- part_size , version , bucket_name )
148
+ part_size , version , bucket_name , metadata )
142
149
return task .upload ()
143
150
144
151
@@ -167,7 +174,7 @@ class _Resume(object):
167
174
168
175
def __init__ (self , up_token , key , input_stream , file_name , data_size , hostscache_dir , params , mime_type ,
169
176
progress_handler , upload_progress_recorder , modify_time , keep_last_modified , part_size = None ,
170
- version = None , bucket_name = None ):
177
+ version = None , bucket_name = None , metadata = None ):
171
178
"""初始化断点续上传"""
172
179
self .up_token = up_token
173
180
self .key = key
@@ -184,6 +191,7 @@ def __init__(self, up_token, key, input_stream, file_name, data_size, hostscache
184
191
self .version = version or 'v1'
185
192
self .part_size = part_size or config ._BLOCK_SIZE
186
193
self .bucket_name = bucket_name
194
+ self .metadata = metadata
187
195
188
196
def record_upload_progress (self , offset ):
189
197
record_data = {
@@ -294,9 +302,9 @@ def upload(self):
294
302
elif self .version == 'v2' :
295
303
make_file_url = self .block_url_v2 (host , self .bucket_name ) + '/%s' % self .uploadId
296
304
return self .make_file_v2 (self .blockStatus , make_file_url , self .file_name ,
297
- self .mime_type , self .params )
305
+ self .mime_type , self .params , self . metadata )
298
306
299
- def make_file_v2 (self , block_status , url , file_name = None , mime_type = None , customVars = None ):
307
+ def make_file_v2 (self , block_status , url , file_name = None , mime_type = None , customVars = None , metadata = None ):
300
308
"""completeMultipartUpload"""
301
309
parts = self .get_parts (block_status )
302
310
headers = {
@@ -306,7 +314,8 @@ def make_file_v2(self, block_status, url, file_name=None, mime_type=None, custom
306
314
'parts' : parts ,
307
315
'fname' : file_name ,
308
316
'mimeType' : mime_type ,
309
- 'customVars' : customVars
317
+ 'customVars' : customVars ,
318
+ 'metadata' : metadata
310
319
}
311
320
ret , info = self .post_with_headers (url , json .dumps (data ), headers = headers )
312
321
if ret is not None and ret != {}:
@@ -354,12 +363,17 @@ def file_url(self, host):
354
363
if self .params :
355
364
for k , v in self .params .items ():
356
365
url .append ('{0}/{1}' .format (k , urlsafe_base64_encode (v )))
357
- pass
358
366
359
367
if self .modify_time and self .keep_last_modified :
360
368
url .append (
361
369
"x-qn-meta-!Last-Modified/{0}" .format (urlsafe_base64_encode (rfc_from_timestamp (self .modify_time ))))
362
370
371
+ if self .metadata :
372
+ for k , v in self .metadata .items ():
373
+ if k .startswith ('x-qn-meta-' ):
374
+ url .append (
375
+ "{0}/{1}" .format (k , urlsafe_base64_encode (v )))
376
+
363
377
url = '/' .join (url )
364
378
return url
365
379
0 commit comments