列出Google云端硬盘的所有文件夹内容

时间:2013-08-01 13:44:03

标签: iphone ios objective-c google-drive-api

您好我使用谷歌驱动的博士编辑示例代码将谷歌潜水与我的应用程序集成。但我无法查看存储在Google云端硬盘帐户中的所有文件。

//我试过这个

-(void)getFileListFromSpecifiedParentFolder 
{
GTLQueryDrive *query2 = [GTLQueryDrive queryForChildrenListWithFolderId:@"root"];
query2.maxResults = 1000;


[self.driveService executeQuery:query2
              completionHandler:^(GTLServiceTicket *ticket,
                                  GTLDriveChildList *children, NSError *error) 
{
 NSLog(@"\nGoogle Drive: file count in the folder: %d",   children.items.count);

if (!children.items.count) 
{
    return ;
}

if (error == nil) 
{
for (GTLDriveChildReference *child in children) 
{

GTLQuery *query = [GTLQueryDrive queryForFilesGetWithFileId:child.identifier];
[self.driveService executeQuery:query                          completionHandler:^(GTLServiceTicket *ticket,
                             GTLDriveFile *file,
                             NSError *error) 
{
NSLog(@"\nfile name = %@", file.originalFilename);}];
                      }
                  }
              }];
 }

//我想在NSLog中显示所有内容......

1 个答案:

答案 0 :(得分:12)

<强> 1。如何从Google云端硬盘获取所有文件。

首先在viewDidLoad:方法中检查身份验证

-(void)viewDidLoad
{
    [self checkForAuthorization];
}

以下是所有方法的定义:

// This method will check the user authentication
// If he is not logged in then it will go in else condition and will present a login viewController
-(void)checkForAuthorization
{
    // Check for authorization.
    GTMOAuth2Authentication *auth =
    [GTMOAuth2ViewControllerTouch authForGoogleFromKeychainForName:kKeychainItemName
                                                          clientID:kClientId
                                                      clientSecret:kClientSecret];
    if ([auth canAuthorize])
    {
        [self isAuthorizedWithAuthentication:auth];
    }
    else
    {
        SEL finishedSelector = @selector(viewController:finishedWithAuth:error:);
        GTMOAuth2ViewControllerTouch *authViewController =
        [[GTMOAuth2ViewControllerTouch alloc] initWithScope:kGTLAuthScopeDrive
                                               clientID:kClientId
                                           clientSecret:kClientSecret
                                       keychainItemName:kKeychainItemName
                                               delegate:self
                                       finishedSelector:finishedSelector];

        [self presentViewController:authViewController animated:YES completion:nil];
    }
}

// This method will be call after logged in
- (void)viewController:(GTMOAuth2ViewControllerTouch *)viewController finishedWithAuth: (GTMOAuth2Authentication *)auth error:(NSError *)error
{
    [self dismissViewControllerAnimated:YES completion:nil];

    if (error == nil)
    {
        [self isAuthorizedWithAuthentication:auth];
    }
}

// If everthing is fine then initialize driveServices with auth
- (void)isAuthorizedWithAuthentication:(GTMOAuth2Authentication *)auth
{
    [[self driveService] setAuthorizer:auth];

    // and finally here you can load all files
    [self loadDriveFiles];
}

- (GTLServiceDrive *)driveService
{
    static GTLServiceDrive *service = nil;

    if (!service)
    {
        service = [[GTLServiceDrive alloc] init];

        // Have the service object set tickets to fetch consecutive pages
        // of the feed so we do not need to manually fetch them.
        service.shouldFetchNextPages = YES;

        // Have the service object set tickets to retry temporary error conditions
        // automatically.
        service.retryEnabled = YES;
    }

    return service;
}

// Method for loading all files from Google Drive
-(void)loadDriveFiles
{
    GTLQueryDrive *query = [GTLQueryDrive queryForFilesList];
    query.q = [NSString stringWithFormat:@"'%@' IN parents", @"root"];
    // root is for root folder replace it with folder identifier in case to fetch any specific folder

    [self.driveService executeQuery:query completionHandler:^(GTLServiceTicket *ticket,
                                                          GTLDriveFileList *files,
                                                          NSError *error) {
        if (error == nil)
        {
            driveFiles = [[NSMutableArray alloc] init];
            [driveFiles addObjectsFromArray:files.items];

            // Now you have all files of root folder
            for (GTLDriveFile *file in driveFiles)
                 NSLog(@"File is %@", file.title);
        }
        else
        {
            NSLog(@"An error occurred: %@", error);
        }
    }];
}

注意:要获得完整的驱动器访问权限,您的范围应为kGTLAuthScopeDrive

[[GTMOAuth2ViewControllerTouch alloc] initWithScope:kGTLAuthScopeDrive
                                           clientID:kClientId
                                       clientSecret:kClientSecret
                                   keychainItemName:kKeychainItemName
                                           delegate:self
                                   finishedSelector:finishedSelector];

<强> 2。如何下载特定文件。

因此,您必须使用GTMHTTPFetcher。首先获取该文件的下载URL。

NSString *downloadedString = file.downloadUrl; // file is GTLDriveFile
GTMHTTPFetcher *fetcher = [self.driveService.fetcherService fetcherWithURLString:downloadedString];
[fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error)
{
     if (error == nil)
     {
         if(data != nil){
           // You have successfully downloaded the file write it with its name
           // NSString *name = file.title;
         }
     }
     else
     {
         NSLog(@"Error - %@", error.description)
     }
}];

注意:如果您发现“downloadedString”为null或者只是看看file.JSON有“exportsLinks”数组,那么您可以使用其中一个获取该文件。

第3。如何在特定文件夹中上传文件:这是上传图片的示例。

-(void)uploadImage:(UIImage *)image
{
    // We need data to upload it so convert it into data
    // If you are getting your file from any path then use "dataWithContentsOfFile:" method
    NSData *data = UIImagePNGRepresentation(image);

    // define the mimeType
    NSString *mimeType = @"image/png";

    // This is just because of unique name you can give it whatever you want
    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"dd-MMM-yyyy-hh-mm-ss"];
    NSString *fileName = [df stringFromDate:[NSDate date]];
    fileName = [fileName stringByAppendingPathExtension:@"png"];

    // Initialize newFile like this
    GTLDriveFile *newFile = [[GTLDriveFile alloc] init];
    newFile.mimeType = mimeType;
    newFile.originalFilename = fileName;
    newFile.title = fileName;

    // Query and UploadParameters
    GTLUploadParameters *uploadParameters = [GTLUploadParameters uploadParametersWithData:data MIMEType:mimeType];
    GTLQueryDrive *query = [GTLQueryDrive queryForFilesInsertWithObject:newFile uploadParameters:uploadParameters];

    // This is for uploading into specific folder, I set it "root" for root folder.
    // You can give any "folderIdentifier" to upload in that folder
    GTLDriveParentReference *parentReference = [GTLDriveParentReference object];
    parentReference.identifier = @"root";
    newFile.parents = @[parentReference];

    // And at last this is the method to upload the file
    [[self driveService] executeQuery:query completionHandler:^(GTLServiceTicket *ticket, id object, NSError *error) {

        if (error){
            NSLog(@"Error: %@", error.description);
        }
        else{
            NSLog(@"File has been uploaded successfully in root folder.");
        }
    }];
}