python-sdk icon indicating copy to clipboard operation
python-sdk copied to clipboard

上传文件时,可以添加校验参数强制校验key和hash 音频元信息的接口

Open ramwin opened this issue 5 years ago • 9 comments

上传文件时,可以添加校验参数强制校验key和hash 音频元信息的接口

ramwin avatar Apr 26 '20 07:04 ramwin

上传的时候已经进行了校验检查了,不能通过返回值里的 key 和 hash 做检查,这两个参数可以被修改,不一定会返回

bachue avatar Jul 09 '21 01:07 bachue

上传的时候已经进行了校验检查了,不能通过返回值里的 key 和 hash 做检查,这两个参数可以被修改,不一定会返回

能给出源码链接吗?我看到的源码里好像没有检查,出错了并不会报错。

ramwin avatar Jul 09 '21 07:07 ramwin

上传的时候已经进行了校验检查了,不能通过返回值里的 key 和 hash 做检查,这两个参数可以被修改,不一定会返回

另外不能通过key和hash做检查也说不通啊,官网文档列子就是用key和hash做检查的。如果真的会被修改,那我们源码里修改就可以,用户反而不用考虑,直接传raise_exception=True就可以,多方便啊。

ramwin avatar Jul 09 '21 08:07 ramwin

这个有人看下回复一下吗

ramwin avatar Mar 27 '24 01:03 ramwin

@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 去做校验。

您看是否已经解答您的疑惑?

lihsai0 avatar Mar 27 '24 06:03 lihsai0

我加这个参数的意义在于, 希望本来要用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 avatar Mar 27 '24 11:03 ramwin

@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()

两种区别不大。

lihsai0 avatar Mar 27 '24 13:03 lihsai0

@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了

ramwin avatar Mar 28 '24 01:03 ramwin

可以理解为您想要一套 exception 的机制吗?这个我们后面考虑下。

lihsai0 avatar Mar 28 '24 08:03 lihsai0