无法使用Google Drive API获取缩略图

时间:2014-05-08 17:39:56

标签: google-drive-api google-oauth google-apps-marketplace

我的应用程序正在使用OAuth2服务帐户从用户的Google云端硬盘复制文件。我正在通过Java使用Google Drive客户端API来获取请求范围为“https://www.googleapis.com/auth/drive”的Drive对象。我可以复制Google Docs文档,但thumbnailLink不可检索。我收到403 Forbidden错误。我非常有信心这是Google方面的一个错误。如果我在我的代码中设置一个断点来获取403 Forbidden结果,我可以(当我正在复制Google Drive的用户登录时)使用thumbnailLink在我的浏览器中获取缩略图。

以下是我正在使用的代码的重写代码段,其中sourceFile是com.google.api.services.drive.model.File,正在复制,而sourceDrive是com.google.api.services.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 Forbidden错误而产生异常。如果我在上面的代码片段的最后一行放置了一个断点,我可以将thumbnailLink粘贴到我的浏览器中,该浏览器以正在复制其驱动器的用户身份登录并成功返回缩略图。 / p>

5 个答案:

答案 0 :(得分:1)

我已将此答案发布在related question中,但此处也适用。我们最近做了一些修改来解决这个问题。请再次尝试您的代码,看看您是否仍然收到此错误。我能够运行以下代码来成功下载我的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)

答案 1 :(得分:0)

我必须这样做。这对我有用:

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());

答案 2 :(得分:0)

可以使用

创建缩略图链接

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

默认情况下会返回220 px的缩略图(max-width-220px max-height-220px,保持纵横比)

您可以使用链接发送更多参数,例如width,height 然后我们需要使用' sz'请求参数 https://drive.google.com/thumbnail?sz=w100-h100&id={YOUR_IMAGE_FILE_ID}

这里sz = w100-h100表示​​高度100px,宽度100px。你也可以通过任何一个人。 如果要同时发送高度和宽度,则必须确保这些值是否保持图像的原始高宽比。

答案 3 :(得分:0)

更新:更新到对请求字段的讨论。

据我所知,这方面的解决方案实际上没有很好的文档。但是,在同事和REST API操作的帮助下,我已经得到了解决方案。

要使用Drive Java Client Library获取有效的thumbnailLink值,您必须修改查询。由于您正在进行自定义字段请求,因此您必须确保添加所需的其他字段。以下是我如何使用它:

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

希望这有帮助!

答案 4 :(得分:0)

如果您使用的是服务帐户,则需要传递具有电子邮件主题的委派凭据,否则会返回 404 错误。

SCOPES = ['https://www.googleapis.com/auth/drive.readonly']

def get_thumbnail(email, thumbnailLink, fileName):
    with open('creds.json', 'r') as f:
        key = json.loads(f.read())
    f.close()
    print("fileName: ", fileName)

    creds = ServiceAccountCredentials.from_json_keyfile_dict(
        key,
        scopes=SCOPES
    )
    creds_del = creds.create_delegated(email)
    http = httplib2.Http()
    http = creds_del.authorize(http)
    print('Downloading thumbnail at: ', thumbnailLink)
    response, content = http.request(thumbnailLink)

    with open(name + '.jpg', 'wb') as f:
        f.write(content)
    f.close()