Не удалось получить эскиз с помощью API Google Диска

Мое приложение использует учетную запись службы OAuth2 для копирования файла с Google Диска. Я использую клиентское приложение Google Drive api через Java, чтобы получить объект "Диск" с запрошенной областью действия " https://www.googleapis.com/auth/drive". Я могу сделать копию документа Документов Google, но thumbnailLink не может быть восстановлен. Я получаю ошибку 403 Forbidden. Я уверен, что это ошибка на стороне Google. Если я поставлю точку останова в своем коде на строке, которая получит 403 Forbidden result, я могу (при входе в систему как пользователь, с которого я копирую Google), используйте значок thumbnailLink, чтобы получить миниатюру в моем браузере.

Здесь приведенный фрагмент кода, который я использую, где sourceFile - com.google.api.services.drive.model.File, который копируется, и sourceDrive - com.google.api.services.drive.Drive, о котором я упоминал выше:

File newFile = new File();
newFile.setTitle( sourceFile.getTitle() );
newFile.setDescription( sourceFile.getDescription() );
newFile.setParents( sourceFile.getParents() );
File copiedFile = sourceDrive.files().copy( sourceFile.getId(), newFile ).execute();
String thumbnailLink = copiedFile.getThumbnailLink();
HttpRequest request = sourceDrive.getRequestFactory().buildGetRequest( new GenericUrl( thumbnailLink ) );
HttpResponse response = request.execute();

Как упоминалось выше, строка request.execute() создает исключение из-за возвращаемой ошибки 403. Если я поставил точку останова в последней строке фрагмента кода выше, я могу взять файл thumbnailLink и вставить его в свой браузер, который входит в систему как пользователь, чей диск копируется, и он возвращает миниатюру, успешно возвращенную.

Ответ 1

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

# Get oauth credentials
...
# Authorize an http object
http = httplib2.Http()
http = credentials.authorize(http)

drive_service = build('drive', 'v2', http=http)

# Google Document type ID
docId = '1ns9x5BMIZAeUR-eXerqgpaHBBGkl_-_KCVpVoV5opn8'
files = drive_service.files().get(fileId=docId).execute()

thumbnailLink = files['thumbnailLink']
print 'Downloading thumbnail at: ', thumbnailLink
response, content = http.request(thumbnailLink)
print response.status

with open('thumbnail.jpg', 'wb') as f:
  f.write(content)

Ответ 2

Я должен был сделать то же самое. Вот что сработало для меня:

final File file = drive.files().get(fileId).execute();
final String thumbnailLink = file.getThumbnailLink();

HttpRequest request = drive.getRequestFactory().buildGetRequest( new GenericUrl( thumbnailLink ) );
HttpResponse response = request.execute();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
response.download(byteArrayOutputStream);
InputStream is = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());

Ответ 3

для миниатюрной ссылки, которую вы можете создать с помощью

https://drive.google.com/thumbnail?id= {YOUR_IMAGE_FILE_ID}

По умолчанию возвращается миниатюра в 220 пикселей (максимальная ширина-220 пикселей max-height-220px, сохраняющая соотношение сторон)

есть больше параметров, которые вы можете отправить по ссылке, такой как ширина, высота Затем нам нужно использовать "sz" querystring https://drive.google.com/thumbnail?sz=w100-h100&id= {YOUR_IMAGE_FILE_ID}

здесь sz = w100-h100 означает высоту 100 пикселей и ширину 100 пикселей. вы тоже можете пройти мимо них. Если вы отправляете как высоту, так и ширину, тогда необходимо быть уверенным в этих значениях, поддерживает ли это исходное соотношение сторон изображения.

Ответ 4

Обновить. Обновите обсуждение полей запроса.

Насколько я могу судить, буквально нет хорошей документации по этому решению. Однако, с помощью сотрудника и REST API, я получил решение.

Чтобы получить правильные значения thumbnailLink, используя клиентскую библиотеку Drive Java, вам необходимо изменить свой запрос. Поскольку вы выполняете индивидуальный запрос поля, вы должны обязательно добавить другие поля, которые хотите. Вот как я начал работать:

Drive.Files.List request = yourGoogleDriveService.files()
                    .list()
                    .setFields("files/thumbnailLink, files/name, files/mimeType, files/id")
                    .setQ("Your file param and/or mime query");

FileList files = request.execute();
files.getFiles();  //Each File in the collection will have a valid thumbnailLink

Надеюсь, это поможет!