8

I have tried some functions of Google drive, but I couldn't able to download the file from Drive.

Here is the code which I used

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

When I ran the script it shows file.getDownloadUrl() is NULL.

What did I miss here?

Now it's executing after adding the following line before I call the download function

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

Now the problem is how to download the file with the help of 'response' which I got from the script....

BenMorel
  • 34,448
  • 50
  • 182
  • 322
Ramkumar P
  • 209
  • 1
  • 2
  • 14

2 Answers2

5

Documents in Google Docs native formats won't have a downloadUrl field, instead you can export them using the exportLinks collection:

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

Claudio Cherubino
  • 14,896
  • 1
  • 35
  • 42
  • 2
    Cool. Thanks. I think Google should response 404 error while user trying to get 'downloadUrl' or 'webContentLink'. Or Google Drive SDK should throw exceptions while user doing so. This would make things much clear! – 尤川豪 Nov 05 '14 at 09:07
  • How can I change the setting so that anyone can download it? In the documentation its written about `viewersCanCopyContent` but don't know how to set its value. – Raunit Verma Mar 03 '22 at 11:55
1

This is what I created to download a file from gooogle drive hope it will help you.

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();
            }
        }
    }
V.Barod
  • 41
  • 2