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

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

您好,我已使用 Dr. Edit 来自 google drive 的示例代码将 google Dive 与我的应用集成。但是我无法查看存储在我的 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。如何从 Google Drive 获取所有文件。

首先在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.");
        }
    }];
}

关于iphone - 列出 Google 云端硬盘中的所有文件夹内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17995787/

相关文章:

iphone - IAP 完成时隐藏/取消隐藏 IBOutlet(UIButton)

iphone - 如何放大 Storyboard(xcode 6)

ios - 苹果 swift : Type Casting Generics

ios - 如何在iOS中仅清除通知

iphone - 如何使文本字段在 iphone 中只接受 4 位数字或数字

iphone - 如何将属性设为私有(private)?

ios - nsobject 与 nsmanagedobject 优缺点

ios - 有没有办法从容器应用程序中打开 iMessage 扩展程序?

ios - 在 PhoneGap BarcodeScanner 上显示应用程序

iphone - 在不重启设备的情况下禁用主页按钮