2013-01-03 10 views
5

Próbowałem niektórych funkcji dysku Google, ale nie mogłem pobrać pliku z Dysku.Jak pobrać plik z google drive za pomocą napędu api java?

Oto kod, który kiedyś

private static InputStream downloadFile(Drive service, File file) { 
    if (file.getDownloadUrl() != null && file.getDownloadUrl().length() > 0) { 
     try { 
     HttpResponse resp = 
      service.getRequestFactory().buildGetRequest(new GenericUrl(file.getDownloadUrl())) 
       .execute(); 
     return resp.getContent(); 
     } catch (IOException e) { 
     // An error occurred. 
     e.printStackTrace(); 
     return null; 
     } 
    } else { 
     // The file doesn't have any content stored on Drive. 
     return null; 
    } 
    } 

Kiedy wpadłem skrypt pokazuje file.getDownloadUrl() jest NULL.

Za czym tęskniłem?

Teraz jest wykonywany po dodaniu następujący wiersz zanim zadzwonię do funkcji pobierania

File file1 = service.files().get(fileid).execute(); 
downloadFile(service,file1); 

Teraz problemem jest to, jak pobrać plik za pomocą „odpowiedzi”, który dostałem od skryptu ... .

+0

jestem nowy na tym ... co jest tu usługa ?? i jak możemy nazwać tę metodę? Rozumiem, co to jest plik, ale nie uzyskuję usługi – zytham

+0

"usługa" jest zdefiniowana przed wywołaniem funkcji .... –

Odpowiedz

4

dokumentów w Dokumentach Google formatach nie będą mieć pole downloadUrl, zamiast można je wyeksportować za pomocą exportLinks kolekcję:

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

+2

Cool. Dzięki. Myślę, że Google powinien odpowiedzieć na błąd 404, podczas gdy użytkownik próbuje pobrać "downloadUrl" lub "webContentLink". Lub pakiet SDK do Dysku Google powinien wyświetlać wyjątki, gdy użytkownik to robi. To by wyjaśniało wszystko! –

0

To jest to, co stworzyłem, aby pobrać plik z dysku gooogle, mam nadzieję, że ci to pomoże.

Please refer to this doc

/** Application name. */ 
private static final String APPLICATION_NAME = "Drive API Java Quickstart"; 

/** Directory to store user credentials for this application. */ 
private static final java.io.File DATA_STORE_DIR = new java.io.File(
     System.getProperty("user.home"), 
     ".credentials/n/drive-java-quickstart"); 

/** Global instance of the {@link FileDataStoreFactory}. */ 
private static FileDataStoreFactory DATA_STORE_FACTORY; 

/** Global instance of the JSON factory. */ 
private static final JsonFactory JSON_FACTORY = JacksonFactory 
     .getDefaultInstance(); 

/** Global instance of the HTTP transport. */ 
private static HttpTransport HTTP_TRANSPORT; 

/** 
* Global instance of the scopes required by this quickstart. 
* 
* If modifying these scopes, delete your previously saved credentials at 
* ~/.credentials/drive-java-quickstart 
*/ 
private static final java.util.Collection<String> SCOPES = DriveScopes 
     .all(); 

static { 
    try { 
     HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); 
     DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); 
    } catch (Throwable t) { 
     t.printStackTrace(); 
     System.exit(1); 
    } 
} 

/** 
* Creates an authorized Credential object. 
* 
* @return an authorized Credential object. 
* @throws IOException 
*/ 
public static Credential authorize() throws IOException { 
    // Load client secrets. 
    InputStream in = Quickstart.class 
      .getResourceAsStream("/client_secret.json"); 
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(
      JSON_FACTORY, new InputStreamReader(in)); 

    // Build flow and trigger user authorization request. 
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
      HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) 
      .setDataStoreFactory(DATA_STORE_FACTORY) 
      .setAccessType("offline").build(); 
    Credential credential = new AuthorizationCodeInstalledApp(flow, 
      new LocalServerReceiver()).authorize("user"); 
    System.out.println("Credentials saved to " 
      + DATA_STORE_DIR.getAbsolutePath()); 
    return credential; 
} 

/** 
* Build and return an authorized Drive client service. 
* 
* @return an authorized Drive client service 
* @throws IOException 
*/ 
public static Drive getDriveService() throws IOException { 
    Credential credential = authorize(); 
    return new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential) 
      .setApplicationName(APPLICATION_NAME).build(); 
} 

public static void main(String[] args) throws IOException { 
    // Build a new authorized API client service. 
    Drive service = getDriveService(); 
    // Print the names and IDs for up to 10 files. 
    FileList result = service.files().list().execute(); 
    List<File> files = result.getFiles(); 
    if (files == null || files.size() == 0) { 
     System.out.println("No files found."); 
    } else { 

     for (File file : files) { 

      String fname = file.getName(); 
      String ex = fname.substring(fname.lastIndexOf(".") + 1); 

      try { 
       Files f = service.files(); 
       HttpResponse httpResponse = null; 
       if (ex.equalsIgnoreCase("xlsx")) { 
        httpResponse = f 
          .export(file.getId(), 
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") 
          .executeMedia(); 

       } else if (ex.equalsIgnoreCase("docx")) { 
        httpResponse = f 
          .export(file.getId(), 
            "application/vnd.openxmlformats-officedocument.wordprocessingml.document") 
          .executeMedia(); 
       } else if (ex.equalsIgnoreCase("pptx")) { 
        httpResponse = f 
          .export(file.getId(), 
            "application/vnd.openxmlformats-officedocument.presentationml.presentation") 
          .executeMedia(); 

       } else if (ex.equalsIgnoreCase("pdf") 
         || ex.equalsIgnoreCase("jpg") 
         || ex.equalsIgnoreCase("png")) { 

        Get get = f.get(file.getId()); 
        httpResponse = get.executeMedia(); 

       } 
       if (null != httpResponse) { 
        InputStream instream = httpResponse.getContent(); 
        FileOutputStream output = new FileOutputStream(
          file.getName()); 
        try { 
         int l; 
         byte[] tmp = new byte[2048]; 
         while ((l = instream.read(tmp)) != -1) { 
          output.write(tmp, 0, l); 
         } 
        } finally { 
         output.close(); 
         instream.close(); 
        } 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
Powiązane problemy