从java中的google驱动器下载pdf和tif文件

时间:2014-05-06 10:16:15

标签: java android pdf google-api google-drive-api

我使用以下代码使用 GDrive v2 api 从Google云端硬盘下载pdf文件。

public InputStream downloadFile(Drive service, String fileId) {
        try {
            System.out.println("From Down load file file id" + fileId);
            System.out.println("From Down load file file id" + service);
            File file = service.files().get(fileId).execute();
            String downloadUrl = file.getDownloadUrl();
            if (downloadUrl != null && downloadUrl.length() > 0) {
                HttpResponse resp = service.getRequestFactory()
                        .buildGetRequest(new GenericUrl(downloadUrl)).execute();
                System.out.println("resp content: " + resp.getContent());
                return resp.getContent();
            } else {
                // The file doesn't have any content stored on Drive.
                return null;
            }
        } catch (IOException e) {
            // An error occurred.
            e.printStackTrace();
            return null;
        }
    }

我正在警告说#34;腐败或不支持的文件格式"当我打开下载的pdf文件时。在Google开发者控制台中,他们提到使用以下行

String downloadUrl = file.getExportLinks().get("application/pdf");

但是当我使用上面这行时,我得到空指针异常。请问ANyone请告诉我如何在我的代码中替换上面的代码来下载pdf文件并打开文件。 此外,我想知道谷歌硬盘中的文件是否已完全下载。

请帮帮我。

提前致谢。

1 个答案:

答案 0 :(得分:0)

您不必在API中使用导出选项,因为pdf文件仅在驱动器中可用,并且没有从Google doc格式转换为任何转换格式(如pdf)。这就是为什么你得到NPE获取导出链接的原因。您可以直接通过API发出Http Get请求来下载文件,如下所示

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

您必须创建FileOutputStream而不是ByteArrayOutputStream来创建包含InputStream的文件。以下代码段可能会有所帮助

OutputStream outputStream = new FileOutputStream(new File("/home/input.pdf")); 
int read = 0; 
byte[] bytes = new byte[1024]; 
while ((read = inputStream.read(bytes)) != -1) { 
outputStream.write(bytes, 0, read); 
}

确保在使用后冲洗OutputStream并关闭两个流。

注意:在与OP讨论后,我得到了这个详细的答案。为简单起见,OP使用ByteArrayOutputStream而不是FileOutputStream来创建pdf文件。希望这有助于某人经过!