Как скачать файл с весенним социальным гуглом?

Я пытаюсь использовать весеннюю социальную библиотеку Google с реализацией 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

Я добавил диск в область, так что я знаю, что это не проблема. При первоначальной проверке подлинности с помощью приложения мне предлагается доступ к диску.

Эти файлы - электронные таблицы Google, но я надеялся, что они будут загружены как файлы Excel. С помощью google SDK это можно сделать, получив exportLinks, а затем загрузив его с этого URL. В то время как весной социальная библиотека Google имеет

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

Ссылки на экспорт не могут быть использованы, потому что downloadFile, похоже, не работает с URL-адресами здесь (или, возможно, они также являются нулевыми).

Кто-нибудь знает как получить файл для скачивания с весеннего соц гугла и диска? Я не нашел ни одного примера кода, который охватывает диск, только Google Plus и задачи.

В настоящее время используется Spring Boot 1.3.3 / Spring 4.2.5 с Spring Social Google 1.0.0 RELEASE

1 ответ

Решение

Spring Social Google не поддерживает загрузку файлов Google Docs, поскольку они не имеют полезного формата. В метаданных нет свойства для загрузки файла, как для других типов файлов.

В то время как собственный SDK Google может обрабатывать загрузку экспортированных форматов, таких как Excel, CSV и PDF, Spring Social Google предоставляет только свойство getExportedLinks() для просмотра URL-адресов и типов, но не предлагает никакого способа их фактической загрузки.

Сейчас я изучаю возможность его разветвления и добавления методов для вызова конечной точки экспорта Google drive v2 или получения токена доступа, чтобы я мог использовать стандартный gdk 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());
        }
    }
}
Другие вопросы по тегам