V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
tianshuang
V2EX  ›  Python

阿里云 OSS 增量上传脚本

  •  
  •   tianshuang · 2017-02-27 10:24:14 +08:00 · 2899 次点击
    这是一个创建于 2624 天前的主题,其中的信息可能已经有所发展或是发生改变。

    aliyun-oss-sync

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

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

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

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

    6 条回复    2017-02-28 20:30:15 +08:00
    whatot
        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. 没有参数解析或者配置文件,硬编码路径

    其它的想到了再说
    whatot
        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 来处理
    xray887
        3
    xray887  
       2017-02-27 13:21:52 +08:00
    大兄弟,感觉你的代码有点 low
    doublleft
        4
    doublleft  
       2017-02-27 13:40:20 +08:00
    这样的文件判断也不是原子性的啊
    tianshuang
        5
    tianshuang  
    OP
       2017-02-28 17:20:40 +08:00
    @whatot 谢谢指出,我也是接触 Python 不久,不是很熟悉相关代码规范,比如你说的参数解析这个问题,在 Java 里就可以用 jcommander ,因为不是很熟悉 Python 的生态,所以写得比较 low ,这个也是我那天下午有空草草看了下 OSS 的文档就编写出的第一个版本,你说的问题我下班了有空时都会一一修改,逐步迭代至正常的水准,额,最后能给个你的联系方式吗?到时 Python 不清楚的地方再请教下,谢谢
    tianshuang
        6
    tianshuang  
    OP
       2017-02-28 20:30:15 +08:00
    关于上面第二点,经测试,对同一个文件,通过 Python SDK 中的 get_object_meta(key)方法拿到的信息比 HTTP HEAD 方法拿到的头信息要少几个字段,相比 HTTP HEAD 方法,正好少了 Content-Md5 这个字段。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2745 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:35 · PVG 20:35 · LAX 05:35 · JFK 08:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.