iOS开发:如何将文件上传至Google Group Drive(共享云端硬盘)?
适配Google共享云端硬盘上传的iOS端实现方案
核心修改逻辑
现有个人盘的上传逻辑只需新增3处改动即可适配共享盘:
- 调整API请求参数
所有涉及共享盘资源操作的请求(包括文件上传、文件夹搜索、文件夹创建)都必须额外开启supportsAllDrives参数,否则API会拒绝访问共享盘内的资源。 - 补充文件元数据字段
上传文件的元数据新增teamDriveId字段,值为目标共享盘的ID。 - 调整权限范围
确保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
相关产品推荐
相关产品推荐

