我的应用程序正在使用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>
答案 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()