如何使用drive api java从谷歌驱动器下载文件?

时间:2013-01-03 04:22:46

标签: java google-drive-api

我尝试了一些Google云端硬盘的功能,但我无法从云端硬盘下载该文件。

以下是我使用的代码

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()为NULL。

我在这里想念的是什么?

现在,在我调用下载函数

之前添加以下行后它正在执行
File file1 = service.files().get(fileid).execute();
downloadFile(service,file1);

现在问题是如何在脚本的'响应'的帮助下下载文件....

2 个答案:

答案 0 :(得分:5)

Google文档原生格式的文档没有downloadUrl字段,您可以使用exportLinks集合导出它们:

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

答案 1 :(得分: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();
            }
        }
    }