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

iOS开发:如何将文件上传至Google Group Drive(共享云端硬盘)?

适配Google共享云端硬盘上传的iOS端实现方案

核心修改逻辑

现有个人盘的上传逻辑只需新增3处改动即可适配共享盘:

  1. 调整API请求参数
    所有涉及共享盘资源操作的请求(包括文件上传、文件夹搜索、文件夹创建)都必须额外开启supportsAllDrives参数,否则API会拒绝访问共享盘内的资源。
  2. 补充文件元数据字段
    上传文件的元数据新增teamDriveId字段,值为目标共享盘的ID。
  3. 调整权限范围
    确保APP申请的Google Drive授权作用域包含写入共享盘的权限,推荐使用kGTLRAuthScopeDrive全量读写权限。

适配后的代码示例

1. 私有upload方法修改

新增可选的共享盘ID入参,补充共享盘相关配置:

private func upload(
    _ parentID: String,
    sharedDriveID: String? = nil, // 传入nil时走个人盘逻辑
    path: String,
    MIMEType: String,
    onCompleted: ((String?, Error?) -> ())?) {
        
    let file = GTLRDrive_File()
    file.name = URL(fileURLWithPath: path).lastPathComponent
    file.mimeType = MIMEType
    file.parents = [parentID]
    
    // 共享盘专属配置
    if let driveID = sharedDriveID {
        file.teamDriveId = driveID
    }
    
    let uploadParams = GTLRUploadParameters(
        fileURL: URL(fileURLWithPath: path),
        mimeType: MIMEType
    )
    let query = GTLRDriveQuery_FilesCreate.query(
        withObject: file,
        uploadParameters: uploadParams
    )
    
    // 必须开启,否则无法访问共享盘
    query.supportsAllDrives = true
    
    // 原有执行请求逻辑不变
    driveService.executeQuery(query) { _, result, error in
        guard let uploadedFile = result as? GTLRDrive_File, error == nil else {
            onCompleted?(nil, error)
            return
        }
        onCompleted?(uploadedFile.identifier, nil)
    }
}

2. 配套逻辑修改

用到的search和createFolder方法也要同步新增supportsAllDrives = true配置,否则无法搜索到共享盘内的文件夹,也无法在共享盘内创建新文件夹:

// 示例:搜索文件夹的查询配置
let searchQuery = GTLRDriveQuery_FilesList.query()
searchQuery.q = "mimeType='application/vnd.google-apps.folder' and name='\(folderName)' and trashed=false"
// 新增共享盘支持
searchQuery.supportsAllDrives = true
searchQuery.includeItemsFromAllDrives = true

3. 公共方法可选扩展

如果需要同时支持个人盘和共享盘上传,可以给公共方法新增可选的共享盘ID参数:

public func uploadFile(
    _ folderName: String,
    sharedDriveID: String? = nil,
    filePath: String,
    MIMEType: String,
    onCompleted: ((String?, Error?) -> ())?) {
        
    search(folderName, sharedDriveID: sharedDriveID) { (folderID, error) in
        if let ID = folderID {
            self.upload(ID, sharedDriveID: sharedDriveID, path: filePath, MIMEType: MIMEType, onCompleted: onCompleted)
        } else {
            self.createFolder(folderName, sharedDriveID: sharedDriveID, onCompleted: { (folderID, error) in
                guard let ID = folderID else {
                    onCompleted?(nil, error)
                    return
                }
                self.upload(ID, sharedDriveID: sharedDriveID, path: filePath, MIMEType: MIMEType, onCompleted: onCompleted)
            })
        }
    }
}

注意事项

  • 共享盘ID可以从网页端Google Drive的地址栏获取,打开目标共享盘后,URL中/drives/后的字符串即为共享盘ID
  • 上传的Google账号必须拥有目标共享盘的写入权限,否则会返回403权限错误
  • 若直接上传到共享盘根目录,parentID参数直接填共享盘ID即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:48:01