2012-11-19 10 views
5

Ich integrierte Google drivs SDK mit meiner iOS-App. Derzeit verwende ich den folgenden Code, um die Dateien von meinem Google Drive A/C basierend auf Download-URL Link herunterladen. Aber wenn ich versuche, die Google Docs-Dateien (die Mime-Typ hat Anwendung/vnd.google-apps.document) Download gibt es keine Download-URL-Link von Google Drive-Bibliothek. Wie kann ich in diesem Fall die Google Docs-Daten herunterladen? Kann ich alternateLink anstelle von URL-Link herunterladen ?. Jede Hilfe muss gewürdigt werden.IOS: Wie kann ich Google Docs-Dateien mit der ios google drive sdk API herunterladen?

Mein Code:

- (void)loadFileContent { 

GTMHTTPFetcher *fetcher = 
[self.driveService.fetcherService fetcherWithURLString:[[self.driveFiles objectAtIndex:selectedFileIdx] downloadUrl]]; 

[fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { 
    if (error == nil) { 
     NSLog(@"\nfile %@ downloaded successfully from google drive", [[self.driveFiles objectAtIndex:selectedFileIdx] originalFilename]); 

     //saving the downloaded data into temporary location 

    } else { 
     NSLog(@"An error occurred: %@", error);    

    } 
}]; 

}

+0

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

+0

@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

+0

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

Antwort

3

Dokumente in Google Docs nativen Formaten kann nicht wie andere Dateien heruntergeladen werden, sondern nur auf verschiedene unterstützte Formate mit dem exportLinks URLs exportiert.

Für weitere Informationen und die Liste der unterstützten Formate überprüfen Sie die Google Drive-SDK-Dokumentation:

https://developers.google.com/drive/manage-downloads#downloading_google_documents

+0

Ich überprüfte die Dokumentation. Aber da kann ich kein Beispiel finden, das sich auf Objectice-C bezieht. Können Sie mir bitte sagen, wie ich den Export-Typ application/pdf von der GTLDriveFileExportLinks-Klasse bekommen kann. – loganathan

+2

Das Objective-C-Beispiel unter http://code.google.com/p/google-api-objective-client/source/browse/trunk/Examples/DriveSample/DriveSampleWindowController.m?#691 zeigt, wie Sie Dateien herunterladen oder exportieren –

+0

Danke :-) Der obige Link löste mein Problem :-) – loganathan

1

ich vor ähnliches Problem hatte. Insbesondere habe ich keine Downloadversion für die in Google Document erstellten nativen Dokumente gefunden. Sie sind null. Nur diejenigen, die mit DrEdit erstellt wurden (Lösungen, die in Drive SDK veranschaulicht werden), sind mit downloadUrl verknüpft.

Die Lösung ist eigentlich in dem Attribut eingebettet: JSON in GTLDriveFileExportLinks Instanz, die * NSMutableDictionary zurückgibt. Sie können den Inhalt des JSON-Objekts über den Zugriff JSONString Attribut anzeigen. Das veränderbare JSON-Wörterbuch kann durch Abfragen von exportLinks in GTLDriveFile Instanz abgerufen werden. Das Beispiel ist wie folgt:

GTLDriveFile *file = files.items[0]; // assume file is assigned to a valid instance. 
NSMutableDictionary *jsonDict = file.exportLinks.JSON; 
NSLog(@"URL:%@.", [jsonDict objectForKey:@"text/plain"]); 
5

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); 
    } 
}]; 
+2

Danke! Es funktionierte. :) Obwohl ich fühle, muss Google an ihrer API-Dokumentation arbeiten. Sein Weg zu kompliziert in unseren Projekten zu implementieren. Dropbox, SkyDrive auf der anderen Seite haben einfache und ziemlich unkomplizierte Verfahren. – Shailesh

+0

@Shailesh, Super !!! :-) yeah du hast recht :-) als ich angefangen habe, das google drive zu integrieren, habe ich sehr viel erlebt. – loganathan

+0

@loganathan wird dieser Block App stürzt ab, wenn die Daten mehr als 1 GB sind? –

Verwandte Themen