使用Google Drive Java API上传JPG时遇权限范围不足错误
Google Drive Java API 上传文件403权限不足问题修复
问题根源
- 权限范围缺失:主类仅申请了Drive Activity API的只读权限,未包含文件上传所需的Drive API权限。
- 认证上下文不一致:上传类独立使用默认凭据(Application Default Credentials),没有复用主类已完成的用户OAuth授权流程,导致权限不匹配。
- 旧令牌缓存:之前生成的只读令牌未清除,修改权限后仍会被复用。
修复步骤
1. 更新权限范围
在DriveActivityQuickstart类中修改SCOPES,添加文件上传的最小必要权限:
private static final List<String> SCOPES = Arrays.asList( DriveActivityScopes.DRIVE_ACTIVITY_READONLY, DriveScopes.DRIVE_FILE // 新增文件上传/修改权限 );
2. 统一认证流程,复用OAuth凭据
修改上传类,直接使用主类已授权的凭据,避免重复认证:
- 调整
UploadBasic的uploadBasic方法,接受Credential参数:
public static String uploadBasic(Credential credential) throws IOException { // 复用主类的HTTP传输和JSON工厂,使用传入的已授权凭据构建Drive服务 Drive service = new Drive.Builder( DriveActivityQuickstart.HTTP_TRANSPORT, DriveActivityQuickstart.JSON_FACTORY, credential) .setApplicationName("Drive samples") .build(); File fileMetadata = new File(); fileMetadata.setName("photo.jpg"); java.io.File filePath = new java.io.File("files/photo.jpg"); FileContent mediaContent = new FileContent("image/jpeg", filePath); try { System.out.println("TESTING THIS LINE"); File file = service.files().create(fileMetadata, mediaContent) .setFields("id") .execute(); System.out.println("File ID: " + file.getId()); return file.getId(); } catch (GoogleJsonResponseException e) { System.err.println("Unable to upload file: " + e.getDetails()); throw e; } }
- 在主类
main方法中,传递已授权的凭据给上传方法:
public static void main(String[] args) throws IOException { Credential credential = authorize(); com.google.api.services.driveactivity.v2.DriveActivity service = getDriveActivityService(); // 打印Drive活动的逻辑保持不变... // 调用上传方法并传入凭据 UploadBasic.uploadBasic(credential); }
3. 清除旧令牌缓存
删除路径C:\java\Quickstart\tokens下的所有文件,确保下次运行时重新获取包含新权限的令牌。
验证
重新运行代码,授权页面会显示新增的文件操作权限,完成授权后即可成功上传JPG文件到Google云端硬盘。
内容的提问来源于stack exchange,提问作者Zoboo
相关产品推荐
相关产品推荐

