首页 > 编程语言 >python分片和断点续传oss

python分片和断点续传oss

时间:2023-09-14 14:45:17浏览次数:58  
标签:断点续传 python oss object bucket upload part key 分片

分片上传和断点续传是常见于文件上传至云存储服务的操作,其中OSS (Object Storage Service) 是阿里云提供的云存储服务。Python 可以用来实现分片上传和断点续传到阿里云 OSS。下面是一个简单的示例,演示了如何使用 Python 和阿里云 OSS SDK 进行分片上传和断点续传。

首先,确保你已经安装了阿里云 OSS SDK。你可以使用以下命令来安装:

pip install oss2

接下来,你可以使用以下代码示例来进行分片上传和断点续传:

import os
import oss2

# 阿里云 OSS 访问信息
access_key_id = 'your_access_key_id'
access_key_secret = 'your_access_key_secret'
endpoint = 'your_endpoint'
bucket_name = 'your_bucket_name'

# 创建 OSS 客户端
auth = oss2.Auth(access_key_id, access_key_secret)
bucket = oss2.Bucket(auth, endpoint, bucket_name)

# 上传文件的本地路径
local_file_path = 'path_to_local_file'
object_key = 'destination_object_key'  # 存储在 OSS 上的对象名称

# 分片上传函数
def multipart_upload(bucket, object_key, local_file_path, part_size=1024 * 1024):
    total_size = os.path.getsize(local_file_path)
    upload_id = None

    try:
        # 初始化分片上传
        upload_id = bucket.init_multipart_upload(object_key).upload_id

        # 计算分片数量
        part_count = (total_size + part_size - 1) // part_size

        # 开始分片上传
        parts = []
        with open(local_file_path, 'rb') as fileobj:
            for i in range(part_count):
                offset = i * part_size
                size = min(part_size, total_size - offset)
                upload_part = bucket.upload_part(object_key, upload_id, i + 1, oss2.PartIterator(fileobj, size))
                parts.append(oss2.models.PartInfo(i + 1, upload_part.etag))

        # 完成分片上传
        bucket.complete_multipart_upload(object_key, upload_id, parts)
        print(f'Successfully uploaded {object_key}')
    except Exception as e:
        print(f'Error uploading {object_key}: {e}')
        if upload_id:
            # 如果出错,取消分片上传
            bucket.abort_multipart_upload(object_key, upload_id)
            print(f'Upload of {object_key} aborted')

# 断点续传函数
def resume_upload(bucket, object_key, local_file_path):
    # 检查对象是否存在,如果存在则获取已上传的分片信息
    if bucket.object_exists(object_key):
        print(f'Resuming upload of {object_key}')
        parts = bucket.list_parts(object_key)

        # 计算已上传的分片数
        uploaded_parts = [part.part_number for part in parts]
        next_part_number = max(uploaded_parts) + 1 if uploaded_parts else 1

        # 打开本地文件,从上次上传结束的地方继续上传
        with open(local_file_path, 'rb') as fileobj:
            fileobj.seek((next_part_number - 1) * part_size)
            upload_part = bucket.upload_part(object_key, upload_id, next_part_number, oss2.PartIterator(fileobj, part_size))
            print(f'Uploaded part {next_part_number}: {upload_part.etag}')
    else:
        # 如果对象不存在,则执行分片上传
        multipart_upload(bucket, object_key, local_file_path)

# 检查是否已经存在对象
if bucket.object_exists(object_key):
    # 如果对象已经存在,则执行断点续传
    resume_upload(bucket, object_key, local_file_path)
else:
    # 如果对象不存在,则执行分片上传
    multipart_upload(bucket, object_key, local_file_path)

在上面的代码中,我们首先导入了必要的库并设置了阿里云 OSS 访问信息。然后,我们定义了一个 multipart_upload 函数,用于执行分片上传,以及一个 resume_upload 函数,用于执行断点续传。最后,我们检查对象是否已经存在,如果存在则执行断点续传,否则执行分片上传。

请确保替换代码中的 your_access_key_id、your_access_key_secret、your_endpoint 和 your_bucket_name 为你的实际阿里云 OSS 访问信息和配置。另外,将 path_to_local_file 替换为你要上传的本地文件的路径,将 destination_object_key 替换为文件在 OSS 上的目标对象键。

标签:断点续传,python,oss,object,bucket,upload,part,key,分片
From: https://www.cnblogs.com/pgyLang/p/17702433.html

相关文章

  • python 根据asctime字符串转成日期
    1、将asctime转换为时间戳如果将asctime转换为日期时间字符串,首先需要将asctime转换为时间戳。时间戳是指自1970年1月1日以来的秒数。Python中的time模块提供了将asctime转换为时间戳的函数mktime。importtimeasctime="FriMay1405:24:592021"t=time.mktim......
  • MySQL 和 Python:无缝结合的数据库应用
    MySQL和Python都是广泛应用于软件开发的重要工具。MySQL是一种强大的关系型数据库管理系统,而Python则是一种灵活的高级编程语言。它们之间的紧密集成为开发人员提供了强大的数据存储和操作能力。本文将探讨MySQL和Python之间的关系,并提供一些示例代码来演示如何在Python......
  • 使用python进行数据同步,根据游标的方式
    使用python进行数据同步,根据游标的方式一、介绍:数据同步分为好几种,比如根据最大id排序,其次才是根据游标进行排序。为什么不使用最大id进行数据同步?如下:因为如果数据表中的数据是按照降序排序的,那么每次根据最大id取1000条数据的方式也是一种可行的分页查询方式。这种方式的优......
  • 使用pyinstaller和electron将python打包为桌面端应用,无法在win7上执行
    在win10或win11上开发的软件,直接在win7上运行,可能导致下面的问题(python3.11electron23.*)(python3.7electron23.*) 原因在于:win10或win11上的开发环境(如python版本,electron版本)过高,win7不支持该环境。解决办法:降低python版本和electron版本,如:win7支持的python3.7和electron1......
  • 使用pyinstaller打包python(anaconda虚拟环境),生成exe文件过大,改用pipenv创建虚拟环境
    pipenv创建虚拟环境时,创建的python环境必须和本机python版本一致。因为本机的python是anaconda默认的python3.11,所以需要先激活conda下的win7py的虚拟环境。接下来才能使用pipenv–python3.7创建python3.7虚拟环境。 激活虚拟环境pipenvshell 根据项目依赖环境下载相应......
  • 记录一个python多线程的错误写法
    直接先上错误代码:importmultiprocessingdeffirst_way():init=3defprocess_function(item):result=item*initreturnresultdata=[1,2,3,4,5,6,7,8,9,10]pool=multiprocessing.Pool(processes=4)#创建一个......
  • glob:Python中文件名的匹配
    前言既然在Pathlib库中提到了glob()函数,那么我们就专门用一篇内容讲解文件名的匹配。其实我们有专门的一个文件名匹配库就叫:glob。不过,glob库的API非常小,但是仅仅应用于文件名的匹配绰绰有余。只要是在实际的项目中需要过滤,或者匹配一组文件,都可以使用该库进行操作。通配符星......
  • Python采集知网
    Python爬虫初探selenium+beautifulsoup4+chromedriver安装模块:*importpymssql*pipinstallbs4*pipinstallselenium*pipinstallpd*pipinstallpandas*pipinstallPyQt5安装浏览器驱动:你自己电脑上装了什么浏览器,就下载对应的驱动程序即可,本文使用的是Google,所......
  • notepad运行python代码的步骤
    notepad运行python代码的步骤:1、用notepad++打开python文件。或者新建文件,保存为.py格式。2、在菜单栏上面有一个运行,我们点击运行->运行,或者使用快捷键F5。3、点击运行菜单后会弹出notepad++中的运行窗口,不是系统自带的cmd运行窗口。输入运行程序名的输入框填写内容为:cmd/k......
  • python:可变类型与不可变类型
    python:可变类型与不可变类型一、引用变量与变量在存储的存储形式在python有个id()方法,可以获取某个变量指向的内存地址num1=10#num1实际储存在栈内存中,当调用num1时通过内存地址引用储存在数据区中的10#如果把num1的值赋予num2,两者是什么关系呢num2=num1print(num......