2013-01-03 310 views
5

我嘗試了谷歌驅動器的一些功能,但我無法從驅動器下載該文件。如何使用驅動器api java從谷歌驅動器下載文件?

下面是我用

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

當我運行該腳本它顯示file.getDownloadUrl()是空的代碼。

我在這裏錯過了什麼?

現在它添加以下行前後我打電話的下載功能

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

現在的問題是如何將下載的文件與「迴應」這是我從拿到劇本的幫助下執行... 。

+0

我是新來這...什麼是服務?在這裏以及我們如何調用這個方法?我明白什麼是文件,但沒有得到有關服務 – zytham

+0

「服務」是在調用函數之前定義的.... –

回答

4

在谷歌文檔原始格式的文檔不會有downloadUrl場,而是可以使用exportLinks收集它們導出:

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

+2

很酷。謝謝。我認爲Google應該在用戶試圖獲得'downloadUrl'或'webContentLink'時迴應404錯誤。或者,Google Drive SDK應該在用戶這樣做時引發異常。這會讓事情變得很清楚! –

0

這是我創建從gooogle驅動器下載文件的希望,希望它能幫助你。

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(); 
      } 
     } 
    } 
相關問題