Google API Python客户端库中的媒体文件上传详解

Google API Python客户端库中的媒体文件上传详解

google-api-python-client 🐍 The official Python client library for Google's discovery based APIs. google-api-python-client 项目地址: https://gitcode.com/gh_mirrors/go/google-api-python-client

前言

Google API Python客户端库提供了强大的功能来处理各种Google API请求,其中媒体文件上传是一个重要且实用的功能。本文将详细介绍如何使用该库实现不同类型的媒体文件上传操作。

基础媒体上传

基本概念

在调用某些API方法时,除了常规的请求体(body)外,还可以上传媒体文件。这些方法通常包含一个名为media_body的参数。

简单文件上传示例

假设我们有一个管理农场动物的API服务,可以通过以下方式上传动物图片:

# 直接使用文件名上传
response = farm.animals().insert(
    media_body='pig.png', 
    body={'name': 'Pig'}
).execute()

指定MIME类型上传

如果需要明确控制上传文件的MIME类型,可以使用MediaFileUpload类:

from googleapiclient.http import MediaFileUpload

media = MediaFileUpload('pig.png', mimetype='image/png')
response = farm.animals().insert(
    media_body=media, 
    body={'name': 'Pig'}
).execute()

可恢复的媒体上传(分块上传)

为什么需要分块上传

对于大型媒体文件,分块上传功能非常有用:

  1. 提高大文件传输的可靠性
  2. 网络中断后可以从断点续传
  3. 减少网络故障时的带宽浪费

基本实现方法

media = MediaFileUpload('pig.png', 
                       mimetype='image/png', 
                       resumable=True)
request = farm.animals().insert(media_body=media, body={'name': 'Pig'})
response = None
while response is None:
    status, response = request.next_chunk()
    if status:
        print(f"已上传 {int(status.progress() * 100)}%")
print("上传完成!")

自定义分块大小

media = MediaFileUpload('pig.png', 
                       mimetype='image/png', 
                       chunksize=1048576,  # 1MB的块大小
                       resumable=True)

分块大小限制说明

  1. 文件大于256KB时:分块大小必须是256KB的倍数
  2. 文件小于256KB时:无限制
  3. 最后一个分块:无大小限制

错误处理机制

可重试的错误状态码

  • 404 Not Found (必须重新开始上传)
  • 500 Internal Server Error
  • 502 Bad Gateway
  • 503 Service Unavailable
  • 504 Gateway Timeout

异常处理最佳实践

from googleapiclient import errors

try:
    # 上传代码
except errors.HttpError as e:
    if e.resp.status in [404]:
        # 需要重新开始整个上传过程
    elif e.resp.status in [500, 502, 503, 504]:
        # 可以重试,但应采用指数退避策略
    else:
        # 不可重试错误,记录并处理

扩展媒体上传功能

自定义媒体上传类

当需要上传非文件类型的媒体数据时(如动态生成的图像),可以创建MediaUpload的子类:

from googleapiclient.http import MediaUpload

class CustomMediaUpload(MediaUpload):
    def __init__(self, data):
        self.data = data
    
    # 必须实现所有抽象方法
    def mimetype(self):
        return 'image/png'
    
    def size(self):
        return len(self.data)
    
    def getbytes(self, begin, length):
        return self.data[begin:begin+length]
    
    def has_stream(self):
        return False
    
    def stream(self):
        raise NotImplementedError

参考实现

可以参考库中已有的实现:

  • MediaFileUpload:处理文件上传
  • MediaIoBaseUpload:处理IO流上传
  • MediaInMemoryUpload:处理内存中的数据上传

总结

Google API Python客户端库提供了灵活多样的媒体上传方式,从简单的文件上传到复杂的分块上传,再到自定义上传实现,能够满足各种场景下的需求。掌握这些技术可以帮助开发者构建更健壮、更高效的应用程序。

在实际应用中,建议根据文件大小和网络状况选择合适的上传方式,并始终实现完善的错误处理机制,特别是对于大文件上传场景。

google-api-python-client 🐍 The official Python client library for Google's discovery based APIs. google-api-python-client 项目地址: https://gitcode.com/gh_mirrors/go/google-api-python-client

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姬忆慈Loveable

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值