你如何使用spring social google下载文件?

时间:2016-06-07 20:37:52

标签: java spring spring-mvc spring-social spring-social-google

我正在尝试将spring社交谷歌库与driveOperations()实现一起使用。每当我尝试下载文件时,都会收到错误消息。我甚至试图下载公开共享文件但没有成功。身份验证正在运行

我尝试了以下变体:

  Resource resource = google.driveOperations().downloadFile("uniquedocidhere");
 // another approach, no error, but getDownloadUrl() is null
  DriveFile driveFile = google.driveOperations().getFile("uniqeidhere");
  google.driveOperations().downloadFile(driveFile); // 404 
// finally trying it with a file drive v2 url gives an invalid URI error

我添加了驱动器到示波器,所以我知道这不是问题。我最初使用应用程序进行身份验证时,系统会提示我访问驱动器。

有问题的文件是谷歌电子表格,但我希望他们下载为excel文件。使用股票谷歌SDK,这可以通过获取exportLinks然后从该URL获取来完成。虽然春季社交谷歌图书馆已经

  final Map<String, String> links = driveFile.getExportLinks();

无法使用导出链接,因为downloadFile似乎不适用于此处的URL(或者它们也可能为null)。

有没有人知道如何使用spring社交谷歌和驱动器下载文件?我还没有找到任何涵盖驱动器的示例代码,只有google plus和任务。

目前使用Spring Boot 1.3.3 / Spring 4.2.5和Spring Social Google 1.0.0 RELEASE

1 个答案:

答案 0 :(得分:0)

Spring社交谷歌不支持下载Google文档文件,因为它们不是有用的格式。元数据上没有用于下载文件的属性,就像其他文件类型一样。

虽然谷歌自己的SDK可以处理下载Excel,CSV和PDF等导出格式,但春季社交谷歌只公开getExportedLinks()属性以查看URL和类型,但没有提供实际下载它们的方法。

我现在正在研究是否有可能分叉并添加方法来调用Google drive v2导出端点或获取访问令牌,以便我可以使用股票谷歌sdk来获取文件。

__

我发现我可以通过调用google.getAccessToken()来访问访问令牌,其中Google是在我的社交配置中创建的

@Bean
    @Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES)
    public Google google(final ConnectionRepository repository) {
        final Connection<Google> connection = repository.findPrimaryConnection(Google.class);
        if (connection == null)
            log.debug("Google connection is null");
        else
            log.debug("google connected");
        return connection != null ? connection.getApi() : null;
    }

然后我可以用这个下载文件:

public class LinkedTemplate extends AbstractOAuth2ApiBinding {
    private String accessToken;

    public LinkedTemplate() {
    }

    public LinkedTemplate(String accessToken) {
        super(accessToken);
        this.accessToken = accessToken;
    }

    class ExcelConverter extends ByteArrayHttpMessageConverter {
        public ExcelConverter() {
            MediaType t = new MediaType("application", "vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            this.setSupportedMediaTypes(Arrays.asList(t));
        }
    }

    public void downloadLinkedFile(final String url, final String outputPath) throws IOException {
        //application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
        RestTemplate template = getRestTemplate();
        template.setMessageConverters(Arrays.asList(new ExcelConverter()));

        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(Arrays.asList(new MediaType("application")));

        HttpEntity<String> entity = new HttpEntity<String>(headers);

        ResponseEntity<byte[]> response = template.exchange(
                url,
                HttpMethod.GET, entity, byte[].class, "1");

        if (response.getStatusCode() == HttpStatus.OK) {
            Files.write(Paths.get(outputPath), response.getBody());
        }
    }
}