zoukankan      html  css  js  c++  java
  • python实现上传文件到OSS

    基础环境

    # +++++ 阿里云OSS开发指南里都有详细的步骤,在这里整理了一下自己需要的东西
    # 确定开发环境,centOS默认安装了python2.7
    # python -V
    # 安装python开发包
    # yum install -y python-devel
    # 安装OSS的sdk
    # yum install -y python-pip
    # pip2.7 install oss2
    # 验证oss2是否安装正确
    '''
    >>> import oss2
    >>> oss2.__version__
    '2.6.0'
    '''
    # 验证OSS扩展库crcmod是否安装
    '''
    在python环境中,输入一下内容,如果有错误信息,则说明扩展库安装不成功,默认安装oss2的时候会安装扩展库
    >>> import crcmod._crcfunext
    如果出现安装不成功,则按一下步骤安装:
    1、执行以下命令卸载crcmod
    # pip uninstall crcmod
    2、安装python-devel
    3、执行以下命令重新安装crcmod
    # pip install crcmod
    '''
    

    小文件上传

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import oss2
    
    # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
    auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
    # Endpoint以杭州为例,其它Region请按实际情况填写。
    bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
    
    # 必须以二进制的方式打开文件,因为需要知道文件包含的字节数。
    with open('<yourLocalFile>', 'rb') as fileobj:
        # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。
        fileobj.seek(1000, os.SEEK_SET)
        # Tell方法用于返回当前位置。
        current = fileobj.tell()
        bucket.put_object('<yourObjectName>', fileobj)
    

    分片上传

    
    # -*- coding: utf-8 -*-import os
    from oss2 import SizedFileAdapter, determine_part_size
    from oss2.models import PartInfo
    import oss2
    
    # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
    auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
    # Endpoint以杭州为例,其它Region请按实际情况填写。
    bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
    
    key = '<yourObjectName>'
    filename = '<yourLocalFile>'
    
    total_size = os.path.getsize(filename)
    # determine_part_size方法用来确定分片大小。
    part_size = determine_part_size(total_size, preferred_size=100 * 1024)
    
    # 初始化分片。
    upload_id = bucket.init_multipart_upload(key).upload_id
    parts = []
    
    # 逐个上传分片。
    with open(filename, 'rb') as fileobj:
        part_number = 1
        offset = 0
        while offset < total_size:
            num_to_upload = min(part_size, total_size - offset)
                    # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。
            result = bucket.upload_part(key, upload_id, part_number,
                                        SizedFileAdapter(fileobj, num_to_upload))
            parts.append(PartInfo(part_number, result.etag))
    
            offset += num_to_upload
            part_number += 1
    
    # 完成分片上传。
    bucket.complete_multipart_upload(key, upload_id, parts)
    
    # 验证分片上传。
    with open(filename, 'rb') as fileobj:
        assert bucket.get_object(key).read() == fileobj.read()
    
  • 相关阅读:
    mini2440裸机试炼之—RTC闹钟中断,节拍中断
    05004_Linux的其他命令和权限命令
    JSP 服务器响应
    JSP 客户端请求
    JSP 过滤器
    JSP 表单处理
    JSP Session
    JSP Cookies 处理
    JSP 日期处理
    JSP 文件上传
  • 原文地址:https://www.cnblogs.com/coolops/p/12841334.html
Copyright © 2011-2022 走看看