You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Google Drive Node.js 大文件可恢复上传实现方案

Google Drive 可恢复上传实现方案(解决大于5MB文件上传问题)

我之前也遇到过完全一样的问题!Google Drive v3的基础drive.files.create接口确实对文件大小做了5MB的限制,超过这个阈值必须切换到可恢复上传流程,官方文档虽然明确了规则但确实缺了实用的示例代码。我整理了一套可直接复用的实现方案,用Python为例,你可以参考:

核心流程说明

可恢复上传分为两个关键步骤:

  1. 先创建一个上传会话,获取专属的上传URL
  2. 将大文件分成固定大小的块,逐个上传到这个URL,支持断点续传

1. 创建可恢复上传会话

这一步需要发送POST请求到Google Drive的可恢复上传端点,带上你的认证凭据和文件元数据(名称、MIME类型等),成功后会返回一个上传会话URL,后续分块上传都要用这个URL。

import requests
from google.oauth2.credentials import Credentials

# 从本地加载已有的认证凭据(你小文件能正常上传,说明这个环节没问题)
creds = Credentials.from_authorized_user_file('token.json')
headers = {
    'Authorization': f'Bearer {creds.token}',
    'Content-Type': 'application/json'
}

# 定义你要上传的文件元数据
file_metadata = {
    'name': '你的大文件名.pdf',
    'mimeType': 'application/pdf'  # 根据你的文件类型调整
}

# 发送请求创建上传会话
response = requests.post(
    'https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable',
    headers=headers,
    json=file_metadata
)

# 提取上传会话URL,后续分块上传依赖这个地址
upload_url = response.headers.get('Location')
if not upload_url:
    raise Exception('创建上传会话失败,请检查认证和元数据格式')

2. 分块上传文件内容

将大文件分成5MB左右的块(最小不能小于256KB),逐个发送PUT请求到刚才获取的上传URL,通过Content-Range头告知服务器当前块的字节范围。如果上传中断,还可以复用这个URL从断点位置继续上传。

import os

file_path = '本地大文件的路径'
file_size = os.path.getsize(file_path)
chunk_size = 5 * 1024 * 1024  # 5MB每块,可根据网络情况调整

with open(file_path, 'rb') as f:
    start_byte = 0
    while start_byte < file_size:
        # 计算当前块的结束字节(注意是闭区间)
        end_byte = min(start_byte + chunk_size, file_size) - 1
        headers = {
            'Content-Range': f'bytes {start_byte}-{end_byte}/{file_size}'
        }

        # 读取当前块的内容
        chunk_data = f.read(chunk_size)
        # 发送PUT请求上传块
        response = requests.put(
            upload_url,
            headers=headers,
            data=chunk_data
        )

        # 处理服务器响应
        if response.status_code == 200:
            print('✅ 文件上传完成!')
            print('文件详情:', response.json())
            break
        elif response.status_code == 308:
            # 服务器返回需要继续上传,获取已上传的最后字节位置
            range_header = response.headers.get('Range')
            if range_header:
                start_byte = int(range_header.split('-')[1]) + 1
            else:
                start_byte = end_byte + 1
            print(f'🔄 继续上传,起始位置:{start_byte}')
        else:
            raise Exception(f'❌ 上传失败,状态码:{response.status_code},响应内容:{response.text}')

一些关键注意事项

  • 块大小可以调整,但不要小于256KB,否则可能被服务器拒绝
  • 如果上传中途中断,不需要重新创建会话,直接复用之前的upload_url即可,服务器会自动返回已上传的范围
  • 确保你的认证凭据拥有https://www.googleapis.com/auth/drive的权限(如果是上传到共享驱动器,还需要额外的团队盘权限)
  • 测试时可以先用6MB左右的文件验证流程,确认没问题再上传更大的文件

内容的提问来源于stack exchange,提问作者LILBRICK1337

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:01:02