2013-01-03 20 views
5

Ho provato alcune funzioni dell'unità Google, ma non sono riuscito a scaricare il file da Drive.Come scaricare un file dall'unità google utilizzando drive api java?

Ecco il codice che ho usato

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; 
    } 
    } 

Quando ho eseguito lo script mostra file.getDownloadUrl() è nullo.

Cosa mi sono perso qui?

ora è in esecuzione dopo aver aggiunto la seguente riga prima di chiamare la funzione di download

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

Ora il problema è come scaricare il file con l'aiuto di 'risposta', che ho ricevuto da copione ... .

+0

io sono nuovo a questo ... che cosa è servizio qui ?? e come possiamo chiamare questo metodo ?? capisco cosa è il file ma non si ottiene il servizio – zytham

+0

"servizio" è definito prima di chiamare la funzione .... –

risposta

4

I documenti in Google Docs formati nativi non avranno un campo downloadUrl, invece è possibile esportare utilizzando la raccolta exportLinks:

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

+2

Cool. Grazie. Penso che Google dovrebbe rispondere 404 errore mentre l'utente cerca di ottenere "downloadUrl" o "webContentLink". O Google Drive SDK dovrebbe generare eccezioni mentre l'utente lo fa. Ciò renderebbe le cose molto chiare! –

0

Questo è quello che ho creato per scaricare un file da gooogle drive spero che ti aiuterà.

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(); 
      } 
     } 
    } 
Problemi correlati