阿里云 OSS 增量上传脚本

2017-02-27 10:24:14 +08:00
 tianshuang

aliyun-oss-sync

此脚本是用来发布我个人博客Poison而编写的,因为工作中常用语言为 Java ,而 Python 仅是副业,代码如有不当之处,敬请指出。

逻辑很简单,递归遍历本地目录,然后判断每个文件在 OSS 里是否存在,如果不存在则直接上传,如果存在则检查 Content-Md5 是否相等,如果不相等则表明该文件内容已经发生变化,则上传该文件, OSS 会自动覆盖同名文件。

值得注意的是检查 Content-Md5 的值是用的 HTTP 的 HEAD 方法,因为我们只需要 header 中的 Content-Md5 字段的值,所以并不需要使用 GET 方法拿到响应体,这样既加快了速度也节省了 OSS 流量。

关于 oss_public_domain 变量的值,你如果在同地域内网的 ECS 上使用该脚本,建议使用内网域名,速度快并且节省了流量费用,否则使用外网域名。

2990 次点击
所在节点    Python
6 条回复
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. 没有参数解析或者配置文件,硬编码路径

其它的想到了再说
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 来处理
xray887
2017-02-27 13:21:52 +08:00
大兄弟,感觉你的代码有点 low
doublleft
2017-02-27 13:40:20 +08:00
这样的文件判断也不是原子性的啊
tianshuang
2017-02-28 17:20:40 +08:00
@whatot 谢谢指出,我也是接触 Python 不久,不是很熟悉相关代码规范,比如你说的参数解析这个问题,在 Java 里就可以用 jcommander ,因为不是很熟悉 Python 的生态,所以写得比较 low ,这个也是我那天下午有空草草看了下 OSS 的文档就编写出的第一个版本,你说的问题我下班了有空时都会一一修改,逐步迭代至正常的水准,额,最后能给个你的联系方式吗?到时 Python 不清楚的地方再请教下,谢谢
tianshuang
2017-02-28 20:30:15 +08:00
关于上面第二点,经测试,对同一个文件,通过 Python SDK 中的 get_object_meta(key)方法拿到的信息比 HTTP HEAD 方法拿到的头信息要少几个字段,相比 HTTP HEAD 方法,正好少了 Content-Md5 这个字段。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/343428

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX