2017-01-09 37 views
0

我正在研究Google Drive Integration使用Java Drive Rest V2 API,我能够获取除文档/文件路径以外的大部分文档/文件元数据属性。如何从Google Drive使用Java Drive Rest V2 API获取文档和文件的绝对路径?

我提到以下StackOverflow的问题,以及:

在这两个环节的解决方案表明,我要创建一个单独的方法来实现这一要求,这意味着有没有Drive Rest V2 API提供的获取文件路径的直接方法。

请指导我,并在此建议您的建议。

谢谢

Arpit

+0

的路径在谷歌drive.files没有这样的概念,可以有多个父母 –

+0

嗨,@ZigMandel谢谢你的回复。这意味着我必须编写一个像“getFilePath(service,file)”这样的自定义方法,并将文件迭代到超级父级[使用file.getParents()]来实现此要求。 – ArpitBora

回答

1

分享我的解决方案,这将可帮助他人:)...

经过谷歌搜索和从Google云端硬盘文档Java Drive Rest V2 API,我知道没有办法调用/获取完整的文件路径。

所以我创建了以下两个自定义的方法来实现我的问题的解决方案:

  1. getFilePath(驱动器,文件)”用字符串返回类型。
  2. getfoldersList(drive,parentReferencesList,folderList)”带有List返回类型的字符串。

下面是代码片段

public static void main(String[] args) throws IOException { 
    // Build a new authorized API client service. 
    Drive service = getDriveService(); 
    try { 
     // Print the file path and name. 
     FileList result = service.files().list().execute(); 
     List<File> files = result.getItems(); 

     if (files == null || files.size() == 0) { 
      System.out.println("No files found."); 
     } else { 
      System.out.println("Files:"); 

      for (File file : files) { 
       if (!(file.getMimeType().contains("folder"))) { 
        String filePath = null; 

        if (!(file.getParents().isEmpty())) { 
         filePath = getFilePath(service, file); 
        } 

        System.out.println("path: " + filePath); 
        System.out.println("name: " + file.getTitle()); 
        System.out.println(); 
       } 
      } 
      System.out.println("== END =="); 
     } 
    } catch (Exception e) { 
     System.out.println(e); 
    } 
} 

private static String getFilePath(Drive drive, File file) throws IOException { 
    String folderPath = ""; 
    String fullFilePath = null; 

    List<ParentReference> parentReferencesList = file.getParents(); 
    List<String> folderList = new ArrayList<String>(); 

    List<String> finalFolderList = getfoldersList(drive, parentReferencesList, folderList); 
    Collections.reverse(finalFolderList); 

    for (String folder : finalFolderList) { 
     folderPath += "/" + folder; 
    } 

    fullFilePath = folderPath + "/" + file.getTitle(); 

    return fullFilePath; 
} 

private static List<String> getfoldersList(Drive drive, List<ParentReference> parentReferencesList, List<String> folderList) throws IOException { 
    for (int i = 0; i < parentReferencesList.size(); i++) { 
     String id = parentReferencesList.get(i).getId(); 

     File file = drive.files().get(id).execute(); 
     folderList.add(file.getTitle()); 

     if (!(file.getParents().isEmpty())) { 
      List<ParentReference> parentReferenceslist2 = file.getParents(); 
      getfoldersList(drive, parentReferenceslist2, folderList); 
     } 
    } 
    return folderList; 
} 

-

感谢,

Arpit宝来

1

尝试使用Parents.get。一个成功的请求会返回一个指向父文件和文件本身的链接。下面是一个示例响应:

{ 
"kind": "drive#parentReference", 
"id": "0Bw-w9jw2bwglbzlvMVh2cll2dmM", 
"selfLink": "https://www.googleapis.com/drive/v2/files/1-ABCDEzyvp9NFmWz7h6ssgkTKHytO1Nq4SNIboDW8A/parents/0Bw-w9jw2bwglbzlvMVh2cll2dmM", 
"parentLink": "https://www.googleapis.com/drive/v2/files/ABCDEjw2bwglbzlvMVh2cll2dmM", 
"isRoot": false 
} 

下面是来自文档的Java实现:

private static boolean isFileInFolder(Drive service, String folderId, 
     String fileId) throws IOException { 
    try { 
     service.parents().get(fileId, folderId).execute(); 
    } catch (HttpResponseException e) { 
     if (e.getStatusCode() == 404) { 
     return false; 
     } else { 
     System.out.println("An error occured: " + e); 
     throw e; 
     } 
    } catch (IOException e) { 
     System.out.println("An error occured: " + e); 
     throw e; 
    } 
    return true; 
    } 
+0

感谢@noogui的回复,你的建议让我达到了我的要求。我会很快发布我的解决方案。 – ArpitBora

相关问题