python-sdk
python-sdk copied to clipboard
上传文件时,可以添加校验参数强制校验key和hash 音频元信息的接口
上传文件时,可以添加校验参数强制校验key和hash 音频元信息的接口
上传的时候已经进行了校验检查了,不能通过返回值里的 key 和 hash 做检查,这两个参数可以被修改,不一定会返回
上传的时候已经进行了校验检查了,不能通过返回值里的 key 和 hash 做检查,这两个参数可以被修改,不一定会返回
另外不能通过key和hash做检查也说不通啊,官网文档列子就是用key和hash做检查的。如果真的会被修改,那我们源码里修改就可以,用户反而不用考虑,直接传raise_exception=True就可以,多方便啊。
这个有人看下回复一下吗
@ramwin
SDK 内不能通过返回值里的 key 和 hash 做检查
原因是 hash 会由于上传方式的不同而变化。SDK 内的 etag 并不完全覆盖所有情况。即存在文件上传正确但 etag 计算出却不一致的情况。
上传的时候已经进行了校验检查了。
能给出源码链接吗?我看到的源码里好像没有检查,出错了并不会报错。
对于表单上传的时候会计算 crc32 并传递给服务端,如果服务端收到的文件计算 crc32 与收到的 crc32 不一致,服务端会返回非 200。
Details
https://github.com/qiniu/python-sdk/blob/f04c99577cd66f4545555ad36f72a071afa3b25e/qiniu/services/storage/uploader.py#L96-L101
https://github.com/qiniu/python-sdk/blob/f04c99577cd66f4545555ad36f72a071afa3b25e/qiniu/services/storage/uploaders/form_uploader.py#L104-L121
对于分片上传 v1,SDK 会对服务端返回的 crc32 与本地计算结果比对,如果不一致返回结果为 None 与不一致的那个分片上传的请求响应。
Details
https://github.com/qiniu/python-sdk/blob/7c25d034d81edbf4c8a3a746a9543915ba0dc2cc/qiniu/services/storage/uploaders/resume_uploader_v1.py#L578-L596
对于分片上传 v2,每一个分片都会计算 md5 并传递给服务端,如果服务端收到的内容计算 md5 与收到的 md5 不一致,服务端会返回非 200。
Details
https://github.com/qiniu/python-sdk/blob/7c25d034d81edbf4c8a3a746a9543915ba0dc2cc/qiniu/services/storage/uploaders/resume_uploader_v2.py#L683-L703
综上所述,在上传过程已保证数据完整性,如果出错,不会返回 key 与 hash 字段。当前已经不推荐使用 SDK 内的 etag 去做校验。
您看是否已经解答您的疑惑?
我加这个参数的意义在于, 希望本来要用3行代码完成的事:
ret, resp = auth.put_file(...)
if "key" not in ret:
raise ValueError
变成1行
ret, resp = auth.put_file(..., raise_exception=True)
服务端会返回非 200, key不存在于ret. 这些都不会报错啊. 还是要在外面加判断
@ramwin 还是不太明白痛点在哪里。raise 的错误最后也是要处理的。
ret, resp = put_file(...)
if "key" not in ret:
handle_upload_failed()
与
try:
ret, resp = put_file(..., raise_exception=True)
except:
handle_upload_failed()
两种区别不大。
@ramwin 还是不太明白痛点在哪里。raise 的错误最后也是要处理的。
ret, resp = put_file(...) if "key" not in ret: handle_upload_failed()与
try: ret, resp = put_file(..., raise_exception=True) except: handle_upload_failed()两种区别不大。
我们用sdk时, 不会 单独为了这一行代码做错误处理. 而是在外层框架上, 遇到报错时统一处理. 所以不会在内部函数里再加try except了
可以理解为您想要一套 exception 的机制吗?这个我们后面考虑下。