Skip to content

Commit 7a5a963

Browse files
committed
Merge pull request #77 from qiniu/develop
Release v6.1.3
2 parents 64aa811 + e2aebfe commit 7a5a963

File tree

4 files changed

+42
-12
lines changed

4 files changed

+42
-12
lines changed

CHANGELOG.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22

33
### v6.1.3
44

5-
2013-08-26 issue []
5+
2013-10-24 issue [#77](https://github.com/qiniu/python-sdk/pull/77)
66

77
- bug fix, httplib_thunk.py 中的无效符号引用
8+
- PutPolicy:增加 saveKey、persistentOps/persistentNotifyUrl、fsizeLimit(文件大小限制)等支持
9+
- 断点续传:使用新的 mkfile 协议
10+
811

912
### v6.1.2
1013

@@ -14,12 +17,14 @@
1417
- 修复在Windows环境下创建临时文件的权限问题
1518
- 修复在Windows环境下对二进制文件计算crc32的bug
1619

20+
1721
### v6.1.1
1822

1923
2013-07-05 issue [#60](https://github.com/qiniu/python-sdk/pull/60)
2024

2125
- 整理文档
2226

27+
2328
### v6.1.0
2429

2530
2013-07-03 issue [#58](https://github.com/qiniu/python-sdk/pull/58)

qiniu/resumable_io.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,7 @@ def gen_crc32(data):
4646
return binascii.crc32(data) & 0xffffffff
4747

4848
class PutExtra(object):
49-
callback_params = None # 当 uptoken 指定了 CallbackUrl,则 CallbackParams 必须非空
50-
bucket = None # 当前是必选项,但未来会去掉
51-
custom_meta = None # 可选。用户自定义 Meta,不能超过 256 字节
49+
params = None # 自定义用户变量, key需要x: 开头
5250
mimetype = None # 可选。在 uptoken 没有指定 DetectMime 时,用户客户端可自己指定 MimeType
5351
chunk_size = None # 可选。每次上传的Chunk大小
5452
try_times = None # 可选。尝试次数
@@ -153,17 +151,17 @@ def putblock(client, block_ret, chunk):
153151
return client.call_with(url, chunk, content_type, len(chunk))
154152

155153
def mkfile(client, key, fsize, extra):
156-
encoded_entry = urlsafe_b64encode("%s:%s" % (extra.bucket, key))
157-
url = ["http://%s/rs-mkfile/%s/fsize/%s" % (conf.UP_HOST, encoded_entry, fsize)]
154+
url = ["http://%s/mkfile/%s" % (conf.UP_HOST, fsize)]
158155

159156
if extra.mimetype:
160157
url.append("mimeType/%s" % urlsafe_b64encode(extra.mimetype))
161158

162-
if extra.custom_meta:
163-
url.append("meta/%s" % urlsafe_b64encode(extra.custom_meta))
159+
if key is not None:
160+
url.append("key/%s" % urlsafe_b64encode(key))
164161

165-
if extra.callback_params:
166-
url.append("params/%s" % urlsafe_b64encode(extra.callback_params))
162+
if extra.params:
163+
for k, v in extra.params.iteritems():
164+
url.append("%s/%s" % (k, urlsafe_b64encode(v)))
167165

168166
url = "/".join(url)
169167
body = ",".join([i["ctx"] for i in extra.progresses])

qiniu/rs/rs_token.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ class PutPolicy(object):
1717
endUser = None
1818
asyncOps = None
1919

20+
saveKey = None
21+
insertOnly = None
22+
detectMime = None
23+
fsizeLimit = None
24+
persistentNotifyUrl = None
25+
persistentOps = None
26+
2027
def __init__(self, scope):
2128
self.scope = scope
2229
# @endgist
@@ -46,15 +53,33 @@ def token(self, mac=None):
4653

4754
if self.asyncOps is not None:
4855
token["asyncOps"] = self.asyncOps
49-
56+
57+
if self.saveKey is not None:
58+
token["saveKey"] = self.saveKey
59+
60+
if self.insertOnly is not None:
61+
token["exclusive"] = self.insertOnly
62+
63+
if self.detectMime is not None:
64+
token["detectMime"] = self.detectMime
65+
66+
if self.fsizeLimit is not None:
67+
token["fsizeLimit"] = self.fsizeLimit
68+
69+
if self.persistentOps is not None:
70+
token["persistentOps"] = self.persistentOps
71+
72+
if self.persistentNotifyUrl is not None:
73+
token["persistentNotifyUrl"] = self.persistentNotifyUrl
74+
5075
b = json.dumps(token, separators=(',',':'))
5176
return mac.sign_with_data(b)
5277

5378
class GetPolicy(object):
5479
expires = 3600
5580
def __init__(self):
5681
pass
57-
82+
5883
def make_request(self, base_url, mac=None):
5984
'''
6085
* return private_url

qiniu/test/resumable_io_test.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,11 @@ def test_put(self):
6565
policy = rs.PutPolicy(bucket)
6666
extra = resumable_io.PutExtra(bucket)
6767
extra.bucket = bucket
68+
extra.params = {"x:foo": "test"}
6869
key = "sdk_py_resumable_block_5_%s" % r(9)
6970
localfile = dst.name
7071
ret, err = resumable_io.put_file(policy.token(), key, localfile, extra)
72+
assert ret.get("x:foo") == "test", "return data not contains 'x:foo'"
7173
dst.close()
7274
os.remove(tmpf)
7375

0 commit comments

Comments
 (0)