我的问题很简单。 集成 Google Drive REST API 后,我终于可以从我的 Google Drive 下载文件了。所以我遵循了这个示例 https://developers.google.com/drive/v3/web/manage-downloads 一切工作正常,在控制台中我得到文件已下载的信息。那么问题来了:它去了哪里,到哪个文件夹?文件保存的路径是什么? 如果我需要将文件保存到 iOS Documents 文件夹,如何设置必要的保存路径?
NSString *fileId = @"0BwwA4oUTeiV1UVNwOHItT0xfa2M";
GTLRQuery *query = [GTLRDriveQuery_FilesGet queryForMediaWithFileId:fileId];
[driveService executeQuery:query completionHandler:^(GTLRServiceTicket *ticket,
GTLRDataObject *file,
NSError *error) {
if (error == nil) {
NSLog(@"Downloaded %lu bytes", file.data.length);
} else {
NSLog(@"An error occurred: %@", error);
}
}];
我正在为 iOS 10 及更高版本进行开发,当我阅读信息时:注意:因为
NSURLConnection
从 iOS 9 和 OS X 10.11 开始已被弃用,所以此类已被 GTMSessionFetcher
取代。我应该使用 Google 提供的代码(上面发布的)或 GTMSessionFetcher
。我正在使用来自 Google 的代码,但如果有人能帮助我解决我的问题(Google 和 GTMSessionFetcher
)变体,我将不胜感激。
UPD:适用于 Google API 客户端库
GTLRDataObject
具有 data
属性,其中包含文件的原始字节。 使用标准 iOS 方法足以保护您的文件。
还有
contentType
属性,它是文件的 MIME 类型 的字符串。您可能希望将此信息与保存的路径一起存储在某个地方data
,它将帮助您正确显示它是什么类型的文件(图像/歌曲/文本),以及在解码/打开/时使用它读取保存的数据以呈现实际信息。
GTLRQuery *query = [GTLRDriveQuery_FilesGet queryForMediaWithFileId:fileId];
[driveService executeQuery:query completionHandler:^(GTLRServiceTicket *ticket,
GTLRDataObject *file,
NSError *error) {
if (error == nil) {
NSLog(@"Downloaded %lu bytes", file.data.length);
// Here is where you take these bytes and save them as file to any location you want (typically your Documents folder)
NSURL *documentsDirectoryURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
[file.data writeToURL:documentsDirectoryURL atomically:YES];
// Now you can store the url/path of the saved file somewhere along with the MIME type string (maybe new class or structure describing the file in your app)
MyFile *file = [[MyFile alloc] initWithFilePath:[documentsDirectoryURL path] mimeType:contentType];
} else {
NSLog(@"An error occurred: %@", error);
}
}];
请参阅 CocoaDocs 以获取
GTLRDataObject
参考。
通用版本:使用iOS SDK
如果您使用
NSURLSession
,它具有委托方法,您可以使用该委托方法将文件从临时位置移动到您需要的任何地方。
Obj-C
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
// Use `location` to move your data to Documents directory or wherever else
}
斯威夫特
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
// Use `location` to move your data to Documents directory or wherever else
}