此脚本是用来发布我个人博客Poison而编写的,因为工作中常用语言为 Java ,而 Python 仅是副业,代码如有不当之处,敬请指出。
逻辑很简单,递归遍历本地目录,然后判断每个文件在 OSS 里是否存在,如果不存在则直接上传,如果存在则检查 Content-Md5 是否相等,如果不相等则表明该文件内容已经发生变化,则上传该文件, OSS 会自动覆盖同名文件。
值得注意的是检查 Content-Md5 的值是用的 HTTP 的 HEAD 方法,因为我们只需要 header 中的 Content-Md5 字段的值,所以并不需要使用 GET 方法拿到响应体,这样既加快了速度也节省了 OSS 流量。
关于 oss_public_domain 变量的值,你如果在同地域内网的 ECS 上使用该脚本,建议使用内网域名,速度快并且节省了流量费用,否则使用外网域名。
1
whatot 2017-02-27 12:43:17 +08:00
问题好多:
1. requirements.txt 没有,依赖也没有说明 2. oss2 本身就有 Bucket.get_object_meta(key),不需要自己 request 去请求 3. oss2 支持 Python 2.6 , 2.7 , 3.3 , 3.4 , 3.5 ,代码只兼容 python2 语法,很浪费 4. 单线程上传 5. 没有 main 6. 没有参数解析或者配置文件,硬编码路径 其它的想到了再说 |
2
whatot 2017-02-27 12:47:53 +08:00
7. oss 里面 key 有限制,在 key 是无效的情况下怎么处理
8. 使用普通的 Bucket.put_object ,有单文件上传大小限制,需要用分块上传或者 Bucket.append_object 9. oss 的 md5 与程序里的 md5 能否保证是一致的,是否需要自己另外用统一的 hash ,使用额外的 meta 来处理 |
3
xray887 2017-02-27 13:21:52 +08:00
大兄弟,感觉你的代码有点 low
|
4
doublleft 2017-02-27 13:40:20 +08:00
这样的文件判断也不是原子性的啊
|
5
tianshuang OP @whatot 谢谢指出,我也是接触 Python 不久,不是很熟悉相关代码规范,比如你说的参数解析这个问题,在 Java 里就可以用 jcommander ,因为不是很熟悉 Python 的生态,所以写得比较 low ,这个也是我那天下午有空草草看了下 OSS 的文档就编写出的第一个版本,你说的问题我下班了有空时都会一一修改,逐步迭代至正常的水准,额,最后能给个你的联系方式吗?到时 Python 不清楚的地方再请教下,谢谢
|
6
tianshuang OP 关于上面第二点,经测试,对同一个文件,通过 Python SDK 中的 get_object_meta(key)方法拿到的信息比 HTTP HEAD 方法拿到的头信息要少几个字段,相比 HTTP HEAD 方法,正好少了 Content-Md5 这个字段。
|