简体   繁体   English

使用 API 将文件上传到 Google Drive 并出现错误 403

[英]Upload the file to Google drive using API and error 403

I want to upload the zip-file to Google drive.我想将 zip 文件上传到 Google 驱动器。 I use Java Quickstart ( https://developers.google.com/drive/v3/web/quickstart/java ) as base.我使用 Java Quickstart ( https://developers.google.com/drive/v3/web/quickstart/java ) 作为基础。 The code works.该代码有效。 I modified it by the following code我用下面的代码修改了它

File fileMetadata = new File();
fileMetadata.setName("My Report");
fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet");

java.io.File filePath = new java.io.File("files/report.csv");
FileContent mediaContent = new FileContent("text/csv", filePath);
File file = driveService.files().create(fileMetadata, mediaContent)
.setFields("id")
.execute();
System.out.println("File ID: " + file.getId());

Now my compiler shows the error 403.现在我的编译器显示错误 403。

c:\wd2>gradle -q run
юъЄ 23, 2016 8:02:06 PM com.google.api.client.util.store.FileDataStoreFactory se
tPermissionsToOwnerOnly
WARNING: unable to change permissions for everybody: C:\Users\Home\.credentials\
drive-java-quickstart
юъЄ 23, 2016 8:02:06 PM com.google.api.client.util.store.FileDataStoreFactory se
tPermissionsToOwnerOnly
WARNING: unable to change permissions for owner: C:\Users\Home\.credentials\driv
e-java-quickstart
Credentials saved to C:\Users\Home\.credentials\drive-java-quickstart
Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonRespo
nseException: 403 Forbidden
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Insufficient Permission",
    "reason" : "insufficientPermissions"
  } ],
  "message" : "Insufficient Permission"
}
        at com.google.api.client.googleapis.json.GoogleJsonResponseException.fro
m(GoogleJsonResponseException.java:146)
        at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClie
ntRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
        at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClie
ntRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest
.executeUnparsed(AbstractGoogleClientRequest.java:432)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest
.executeUnparsed(AbstractGoogleClientRequest.java:352)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest
.execute(AbstractGoogleClientRequest.java:469)
        at DriveQuickstart.main(DriveQuickstart.java:126)

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':run'.
> Process 'command 'C:\Program Files\Java\jdk1.8.0_101\bin\java.exe'' finished w
ith non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug
option to get more log output.

How can I fix it?我该如何解决?

The source code:源代码:

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.FileContent;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;

import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.*;
import com.google.api.services.drive.Drive;


import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;

public class DriveQuickstart {
    /** Application name. */
    private static final String APPLICATION_NAME =
        "Drive API Java Quickstart";

    /** Directory to store user credentials for this application. */
    private static final java.io.File DATA_STORE_DIR = new java.io.File(
        System.getProperty("user.home"), ".credentials/drive-java-quickstart");

    /** Global instance of the {@link FileDataStoreFactory}. */
    private static FileDataStoreFactory DATA_STORE_FACTORY;

    /** Global instance of the JSON factory. */
    private static final JsonFactory JSON_FACTORY =
        JacksonFactory.getDefaultInstance();

    /** Global instance of the HTTP transport. */
    private static HttpTransport HTTP_TRANSPORT;

    /** Global instance of the scopes required by this quickstart.
     *
     * If modifying these scopes, delete your previously saved credentials
     * at ~/.credentials/drive-java-quickstart
     */
    private static final List<String> SCOPES =
        Arrays.asList(DriveScopes.DRIVE_METADATA_READONLY);

    static {
        try {
            HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
            DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
        } catch (Throwable t) {
            t.printStackTrace();
            System.exit(1);
        }
    }

    /**
     * Creates an authorized Credential object.
     * @return an authorized Credential object.
     * @throws IOException
     */
    public static Credential authorize() throws IOException {
        // Load client secrets.
        InputStream in =
            DriveQuickstart.class.getResourceAsStream("/client_secret.json");
        GoogleClientSecrets clientSecrets =
            GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

        // Build flow and trigger user authorization request.
        GoogleAuthorizationCodeFlow flow =
                new GoogleAuthorizationCodeFlow.Builder(
                        HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
                .setDataStoreFactory(DATA_STORE_FACTORY)
                .setAccessType("offline")
                .build();
        Credential credential = new AuthorizationCodeInstalledApp(
            flow, new LocalServerReceiver()).authorize("user");
        System.out.println(
                "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
        return credential;
    }

    /**
     * Build and return an authorized Drive client service.
     * @return an authorized Drive client service
     * @throws IOException
     */
    public static Drive getDriveService() throws IOException {
        Credential credential = authorize();
        return new Drive.Builder(
                HTTP_TRANSPORT, JSON_FACTORY, credential)
                .setApplicationName(APPLICATION_NAME)
                .build();
    }

    public static void main(String[] args) throws IOException {
        // Build a new authorized API client service.
        Drive service = getDriveService();

        // Print the names and IDs for up to 10 files.
        FileList result = service.files().list()
             .setPageSize(10)
             .setFields("nextPageToken, files(id, name)")
             .execute();

        //*
        File fileMetadata = new File();
        fileMetadata.setName("My Report");
        fileMetadata.setMimeType("application/zip");

        java.io.File filePath = new java.io.File("c:\\profiles.zip");
        FileContent mediaContent = new FileContent("application/zip", filePath);
        File file = service.files().create(fileMetadata, mediaContent)
        .setFields("id")
        .execute();
        System.out.println("File ID: " + file.getId()); //*/
    }

}

I would also recommend changing the SCOPE from Arrays.asList(DriveScopes. DRIVE_METADATA_READONLY );我还建议从 Arrays.asList(DriveScopes. DRIVE_METADATA_READONLY ); 更改范围 to Arrays.asList(DriveScopes. DRIVE );到Arrays.asList(DriveScopes DRIVE);

Here is more documentation on Google Drive API SCOPES .这里有更多关于Google Drive API SCOPE 的文档。

  1. When changing the SCOPE remember to delete your " StoredCredential " file that is stored within the tokens folder of your project.更改 SCOPE 时,请记住删除存储在项目的tokens文件夹中的“ StoredCredential ”文件。

  2. Run your program again so that you will be prompted to provide Google login credentials to allow your program to organize, add and edit files on Google Drive.再次运行您的程序,系统将提示提供 Google 登录凭据,允许您的程序组织、添加和编辑Google Drive 上的文件。

  3. Ensure that you allow your program to organize, add and edit files on Google Drive when granting permission in the authentication process.在身份验证过程中授予权限时,请确保您允许您的程序组织、添加和编辑Google Drive 上的文件

  4. The authentication process will generate a new " StoredCredential " file that will include your new SCOPE which you have specified.身份验证过程生成一个新的“ StoredCredential ”文件,其中将包含您指定的新 SCOPE

This worked for me hope it will work for you as well.这对我有用,希望它也对你有用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 使用java api将文件上传到谷歌驱动器 - upload file into google drive using java api 使用Google Drive Api上传文件 - Upload file using Google Drive Api 无法使用 REST API 在谷歌驱动器的特定文件夹中上传文件 - Unable to upload file in specific folder in google drive using REST API 如何使用 Java Google Drive API 上传文件 - How to upload file using Java Google Drive API 使用 Java 和 Google Drive API V3 将文件上传到共享的 Google Drive 位置? - Upload a file to shared google drive location using Java with Google Drive API V3? Google Drive API上传文件异常 - Google drive API upload file exception 使用Java中的Cloud Storage JSON API在Google Cloud中恢复可上传的文本文件,面临禁止访问的问题,并显示403错误代码 - Resumable upload text file in Google cloud using Cloud Storage JSON API in java, facing issue of access forbidden with 403 error code 在Java中使用Google Drive API上传文件时获取403禁止 - Getting 403 Forbidden When Uploading file using Google Drive API in Java 如何使用 Google Drive API (Java) 解决 403 用户权限错误 - How to solve 403 User Permissions error with Google Drive API (Java) 使用驱动器API将SQL数据库上传到Google驱动器 - Upload sql database to google drive using drive api
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM