Hier die Schritte zum Herunterladen der Datei von Google Drive. Es funktioniert sowohl für die Datei als auch für Google Docs.
Schritt 1:
die Dateiliste holen und speichern sie in einem Array oder dict mit entsprechenden Download-Link URL file:
- (void)loadDriveFiles {
fileFetchStatusFailure = NO;
//for more info about fetching the files check this link
//https://developers.google.com/drive/v2/reference/children/list
GTLQueryDrive *query2 = [GTLQueryDrive queryForChildrenListWithFolderId:[parentIdList lastObject]];
query2.maxResults = 1000;
// queryTicket can be used to track the status of the request.
[self.driveService executeQuery:query2
completionHandler:^(GTLServiceTicket *ticket,
GTLDriveChildList *children, NSError *error) {
GTLBatchQuery *batchQuery = [GTLBatchQuery batchQuery];
//incase there is no files under this folder then we can avoid the fetching process
if (!children.items.count) {
[self.driveFiles removeAllObjects];
[fileNames removeAllObjects];
[self performSelectorOnMainThread:@selector(reloadTableDataFromMainThread) withObject:nil waitUntilDone:NO];
return ;
}
if (error == nil) {
int totalChildren = children.items.count;
count = 0;
[self.driveFiles removeAllObjects];
[fileNames removeAllObjects]; //http://stackoverflow.com/questions/14603432/listing-all-files-from-specified-folders-in-google-drive-through-ios-google-driv/14610713#14610713
for (GTLDriveChildReference *child in children) {
GTLQuery *query = [GTLQueryDrive queryForFilesGetWithFileId:child.identifier];
query.completionBlock = ^(GTLServiceTicket *ticket, GTLDriveFile *file, NSError *error) {
//increment count inside this call is very important. Becasue the execute query call is asynchronous
count ++;
NSLog(@"Google Drive: retrieving children info: %d", count);
if (error == nil) {
if (file != nil) { //checking the file resource is available or not
//only add the file info if that file was not in trash
if (file.labels.trashed.intValue != 1)
[self addFileMetaDataInfo:file numberOfChilderns:totalChildren];
}
//the process passed all the files then we need to sort the retrieved files
if (count == totalChildren) {
NSLog(@"Google Drive: processed all children, now stopping HUDView - 1");
[self performSelectorOnMainThread:@selector(reloadTableDataFromMainThread) withObject:nil waitUntilDone:NO];
}
} else {
//the file resource was not found
NSLog(@"Google Drive: error occurred while retrieving file info: %@", error);
if (count == totalChildren) {
NSLog(@"Google Drive: processed all children, now stopping HUDView - 2");
[self performSelectorOnMainThread:@selector(reloadTableDataFromMainThread)
withObject:nil waitUntilDone:NO];
}
}
};
//add the query into batch query. Since we no need to iterate the google server for each child.
[batchQuery addQuery:query];
}
//finally execute the batch query. Since the file retrieve process is much faster because it will get all file metadata info at once
[self.driveService executeQuery:batchQuery
completionHandler:^(GTLServiceTicket *ticket,
GTLDriveFile *file,
NSError *error) {
}];
NSLog(@"\nGoogle Drive: file count in the folder: %d", children.items.count);
} else {
NSLog(@"Google Drive: error occurred while retrieving children list from parent folder: %@", error);
}
}];
}
Schritt-2: die Datei hinzufügen Metadaten info
-(void)addFileMetaDataInfo:(GTLDriveFile*)file numberOfChilderns:(int)totalChildren
{
NSString *fileName = @"";
NSString *downloadURL = @"";
BOOL isFolder = NO;
if (file.originalFilename.length)
fileName = file.originalFilename;
else
fileName = file.title;
if ([file.mimeType isEqualToString:@"application/vnd.google-apps.folder"]) {
isFolder = YES;
} else {
//the file download url not exists for native google docs. Sicne we can set the import file mime type
//here we set the mime as pdf. Since we can download the file content in the form of pdf
if (!file.downloadUrl) {
GTLDriveFileExportLinks *fileExportLinks;
NSString *exportFormat = @"application/pdf";
fileExportLinks = [file exportLinks];
downloadURL = [fileExportLinks JSONValueForKey:exportFormat];
} else {
downloadURL = file.downloadUrl;
}
}
if (![fileNames containsObject:fileName]) {
[fileNames addObject:fileName];
NSArray *fileInfoArray = [NSArray arrayWithObjects:file.identifier, file.mimeType, downloadURL,
[NSNumber numberWithBool:isFolder], nil];
NSDictionary *dict = [NSDictionary dictionaryWithObject:fileInfoArray forKey:fileName];
[self.driveFiles addObject:dict];
}
}
Schritt-3: Datei herunterladen basierend auf Datei auswählen in der Tabellenzeile
NSString *downloadUrl = [[[[self.driveFiles objectAtIndex:selectedFileIdx] allValues] objectAtIndex:0]
objectAtIndex:download_url_link];
NSLog(@"\n\ngoogle drive file download url link = %@", downloadUrl);
GTMHTTPFetcher *fetcher =
[self.driveService.fetcherService fetcherWithURLString:downloadUrl];
//async call to download the file data
[fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) {
if (error == nil) {
NSLog(@"\nfile %@ downloaded successfully from google drive", self.selectedFileName);
//saving the downloaded data into temporary location
[data writeToFile:<path> atomically:YES];
} else {
NSLog(@"An error occurred: %@", error);
}
}];
Haben Sie es geschafft, die Dateien herunterzuladen? Ich würde gerne wissen, wie es funktioniert hat. Ich versuche auch, die Dateien herunterzuladen, aber bis jetzt kann ich keine Ressource finden, die mir dabei helfen würde. – Shailesh
@Shailesh, Ja, ich kann die Dateien von Google Drive herunterladen. In meinem Fall habe ich den Download-Vorgang initiiert, wenn der Benutzer auf den Dateinamen tippt. Welches Problem hast du? – loganathan
Ich verwende den Code, den Google für eines ihrer Beispiele angegeben hat. Name des Projekts ist "DriveSample" Ich bekomme die Export/Download-URL NULL. Es kann nicht vollständig heruntergeladen werden. – Shailesh